【发布时间】:2016-11-20 09:25:52
【问题描述】:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockTest {
Lock lck=new ReentrantLock();
public void lockIt(){
lck.lock();
for(int i=0;i<10;i++) {
System.out.println("i : "+ i);
try{Thread.sleep(200);} catch (Exception e){}
}
lck.unlock();
}
public void test()
{
synchronized(this) **// mark 1**
{
for(int j=0;j<10;j++)
{
System.out.println("val is"+j);
try{Thread.sleep(200);}catch (Exception e){}
}
}
}
public static void main(String[] args) {
LockTest obj=new LockTest();
new Thread(new Runnable() {
@Override
public void run() {
obj.lockIt();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
obj.test();
}
}).start();
}
}
} // 在上述情况下,当我们说 lck.lock();然后获取锁 实际上是哪个对象?是“this”还是“lck”本身?
即使在“this”或“lck”对象上获得了锁 那么差异如何。线程能够进入临界区 被同一个“this”或“lck”对象锁定。
案例 1:当我们在 mark1 使用 synchronized(this) 时.. 情况 2:当我们在标记 1 处使用 synchronized(lck ) 时..
在这两种情况下,两个循环都并行运行。
【问题讨论】:
-
看看winterbe.com/posts/2015/04/30/…。您的问题的答案是 lock 方法确保锁定的块只能由一个线程访问。它实际上并没有锁定实际的
object,因此synchronized是一种不同的方法。
标签: java concurrency locks