我是java新手,我在java线程中实现synchronized代码块时遇到问题。
class btstep extends Thread
{
private static final Object lock = new Object();
public void run()
{
synchronized(lock)
{
System.out.println("3 ");
System.out.println("4 ");
}
}
}
class btevent extends Thread
{
private static final Object locko = new Object();
public void run()
{
synchronized(locko)
{
System.out.println("1 ");
System.out.println("2 ");
}
}
}
public class Interleaving
{
public static btevent bt = new btevent();
public static btstep bs = new btstep();
public static void main(String[] args)
{
bt.start();
bs.start();
}
}
此程序的运行输出
1
3
2
4
这不是我想要的。同步的代码块不再是串行的交错 我想要的输出是
1
2
3
4
或
3
4
1
2
我在节目中做错了什么?
答案 0 :(得分:3)
您正在使用两个不同的锁定对象(lock
和locko
),因此这些块不是互斥的。您需要两个块在同一个锁对象上同步才能达到您想要的效果。
答案 1 :(得分:0)
两个线程都需要共享同一个锁对象实例,只有这样你才能实现所需的输出。
答案 2 :(得分:0)
同步时,对象的选择每个都很重要。如果您希望两个线程进行交互,则它们必须在相同的对象上进行同步。
最简单的解决方案是使用
synchronized(System.out) {
同步您的输出。
答案 3 :(得分:0)
要同步2个(或更多)代码块,必须在同一对象上同步它们。在您的情况下,对象是不同的。