The difference between non-synchronized threads and synchronized threads
本问题已经有最佳答案,请猛点这里访问。
问题是我看不到同步块的效果。从理论上讲,我知道它应该锁定这个块,直到它完成对线程的处理。当我使用或不使用同步块运行以下代码时,没有任何变化,好吧,至少我是这样认为的。基本上,如何使这些线程有序地显示?请帮我清理一下,谢谢。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public class Threads9 extends Thread{ private String name; public Threads9(String paramName){ name = paramName; } public void run() { print(); } private void print() { synchronized(this){ for(int i = 0;i<10;i++){ System.out.println(name+" looping"); } } } } public class Threads9Main{ public static void main(String[] args) { Threads9 thread1 = new Threads9("Thread1"); Threads9 thread2 = new Threads9("Thread2"); thread1.start(); thread2.start(); } } |
您在"this"上进行同步,线程之间的同步不同。尝试在:threads9.class上同步,它就会工作。另外,大幅增加循环大小,否则第一个循环将在第二个循环开始之前完成。
像这样更改代码,并将同步块放入run。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
您的对象没有共享监视器,因此您将没有任何线程间通信。
尝试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class Threads9 extends Thread{ private String name; private static Object lock = new Object(); public Threads9(String paramName){ name = paramName; } public void run() { print(); } private void print() { synchronized(lock){ for(int i = 0;i<10;i++){ System.out.println(name+" looping"); } } } } |