多线程中的同步

Synchronization in multi threading

我是多线程的初学者,遇到了这个概念:

2 methods m1 being non static synchronised and m2 being static synchronised and 2 threads T1 accessing m1 with object o1 and T2 accessing m2 can run concurrently since m1 and m2 are synchronised on 2 different objects.

那么为什么在下面的例子中线程不能并发访问方法,即使对象是不同的 Foo.class 和 f1 和 f2?

class Foo implements Runnable{
    void run()
        synchronised(Foo.class)
        { 
         ....

        }
    }
}
class Test{
    psvm(){

        Foo f1 = new Foo();
        Foo f2 = new Foo();
        Thread t1 = new Thread(f1);
        Thread t2 = new Thread(f2);
        t1.start();
        t2.start(); 
    }
}

2 methods m1 being non static synchronised and m2 being static synchronised and 2 threads T1 accessing m1 with object o1 and T2 accessing m2 can run concurrently since m1 and m2 are synchronised on 2 different objects.

非静态方法m1在this(当前实例)上同步,静态方法m2在this.getClass()(当前实例所属的class对象)上同步。它们在不同的对象上同步,所以它们不能互相阻塞。

在发布的代码中,synchronized 块有一个显式监视器锁 Foo.class,不同的 Foo 实例共享相同的 Foo.class,这意味着代码在 同一个对象。因此,只有一个线程可以进入同步块,其他线程将被阻塞直到它存在。

在您的代码中,同步已作为 class 级别锁定 完成。

当一个线程正在访问时,另一个线程等待轮到它..

当你想限制并发性时使用同步,这样所有线程都可以轮到他们访问资源