我搜索了很多,但对'ReentrantLock'和普通'同步'的过程感到困惑。
例如( 1 ):
Object obj = new Object();
synchronized(obj){
//lock is guaranteed to be acquired
}
实施例(的 2 )
Lock lock = new ReentrantLock();
lock.lock(); //problem here
try{
//dostuff
}
finally{
lock.unlock();
}
我的问题是:
在示例 1 中:保证使用synchronized关键字获取对象的锁定。
但是
例如 2 :是否可以保证使用 lock.lock()方法获取锁定?或者线程会进入下一行执行?没有获得锁定。
我对此表示怀疑,因为使用线程已经多次为我带来意想不到的结果。
答案 0 :(得分:5)
只有一个线程会获得锁定:这是ReentrantLock
的合同。
因此,您的示例2完全是线程安全的。