具有相同对象引用的不同线程中的两个同步块仍在同时执行
two synchronised blocks at different threads with same object reference still executing simultaneously
public class SynchronizedTest
{
public static void main(String argv[])
{
Thread t1 = new Thread(new Runnable(){public void run()
{
synchronized (this) //line 7
{
for(int i=0; i<100; i++)
System.out.println("thread A "+i);
}
}});
t1.start();
synchronized(t1) // line 15
{
for(int i=0; i<100; i++)
System.out.println("thread B "+i);
}
}
}
如果我理解正确,那么在第 7 行同步块引用对象 t1
并且在第 15 行同步块也引用同一个对象,这样一次只有一个线程可以获得锁此对象和其他对象必须等待。
那他们为什么要争锋相对呢?输出像
一样混合
thread B 62
thread B 63
thread B 64
thread A 0
thread A 1
thread A 2
thread B 65
thread A 3
您没有为锁使用同一个实例。
this
是 Runnable
实例,t1
是 Thread
实例
我更喜欢声明private static Object LOCK = new Object();
,这是内存中最小的实例,这很容易知道它的用途。
根据评论编辑(Steffen Frank)
这与 synchronized(MyClass.class)
有一些相似之处,但是由于任何人都可以访问 MyClass.class
的这个实例,任何人都可以使用这个锁,所以任何人都可以创建死锁,使用特定的实例给你帮助在上面,如果你愿意,让你分享。
public class SynchronizedTest
{
public static void main(String argv[])
{
Thread t1 = new Thread(new Runnable(){public void run()
{
synchronized (this) //line 7
{
for(int i=0; i<100; i++)
System.out.println("thread A "+i);
}
}});
t1.start();
synchronized(t1) // line 15
{
for(int i=0; i<100; i++)
System.out.println("thread B "+i);
}
}
}
如果我理解正确,那么在第 7 行同步块引用对象 t1
并且在第 15 行同步块也引用同一个对象,这样一次只有一个线程可以获得锁此对象和其他对象必须等待。
那他们为什么要争锋相对呢?输出像
一样混合 thread B 62
thread B 63
thread B 64
thread A 0
thread A 1
thread A 2
thread B 65
thread A 3
您没有为锁使用同一个实例。
this
是 Runnable
实例,t1
是 Thread
实例
我更喜欢声明private static Object LOCK = new Object();
,这是内存中最小的实例,这很容易知道它的用途。
根据评论编辑(Steffen Frank)
这与 synchronized(MyClass.class)
有一些相似之处,但是由于任何人都可以访问 MyClass.class
的这个实例,任何人都可以使用这个锁,所以任何人都可以创建死锁,使用特定的实例给你帮助在上面,如果你愿意,让你分享。