关于java:非同步线程和同步线程之间的区别

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
public Threads9(String paramName){
    name = paramName;
}

public void run() {
    synchronized(this){
    print();
    }
}

private void print() {

    for(int i = 0;i<10;i++){
        System.out.println(name+" looping");
    }

}


您的对象没有共享监视器,因此您将没有任何线程间通信。

尝试:

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");
            }
        }
    }
}