多线程同步

Kar*_*ckN 2 java multithreading

同步适用于以下代码.

  public class Main implements Runnable {
    public static void main(String[] args) {
        Main m = new Main();
        for (int i = 0; i < 2; i++) {
            Thread t = new Thread(m);
            t.start();
        }
    }

    @Override
    public void run() {
        synchronized(this) {
            for (int i = 0; i < 500; i++) {
                System.out.println(i);
            }
        }
    }
 }

 // Synchronization isn't working here.

 public class Main implements Runnable {
    public static void main(String[] args) {
        for (int i = 0; i < 2; i++) {
            Thread t = new Thread(new Main());
            t.start();
        }
    }

    @Override
    public void run() {
        synchronized(this) {
            for (int i = 0; i < 500; i++) {
                System.out.println(i);
            }
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

在一次采访中询问了这个问题.我对此有点困惑,所以我试图理解为什么同步不能与第二个代码片段一起使用.任何人都可以解释为什么同步不能与第二个代码片段一起使用?

Nam*_*ala 6

因为如果您正在处理单个对象,则应用同步.

在第一种情况下,你有Main的单个runnable对象ie m

在第二种情况下,您有Main的独立对象.

for(int i=0;i<2;i++){
    Thread t = new Thread(new Main()); // independent objects for each thread
    t.start();
}
Run Code Online (Sandbox Code Playgroud)

阐释:

如果你看到下面的代码,你会发现

synchronized (this) {
Run Code Online (Sandbox Code Playgroud)

this指对象本身.因此,基于此对象应用锁定.因此,在多个Main类对象的情况下,它们独立工作,而单一对象同步仅适用于该对象.


有关更多信息,请参阅:内部锁定和同步

文档中的代码

public class MsLunch {
    private long c1 = 0;
    private long c2 = 0;
    private Object lock1 = new Object();
    private Object lock2 = new Object();

    public void inc1() {
        synchronized(lock1) { // lock is acquired using lock1 object 
            c1++;
        }
    }

    public void inc2() {
        synchronized(lock2) { // lock is acquired using lock1 object 
            c2++;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,您可以同时调用这两个方法inc1()inc2()使用单个对象,因为在不同对象上获取了锁.这将有助于您更好地理解它.

所以在你的情况下获取锁this(对象本身).因此,只要你有多个对象,它就可以独立工作,当你拥有单个对象时,它将同步工作.