多线程同步

时间:2018-05-08 18:08:05

标签: java multithreading synchronization runnable

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

  

2个方法m1是非静态同步的,m2是静态的   同步和2个线程T1访问m1与对象o1和T2   访问m2可以同时运行,因为m1和m2在2上同步   不同的对象。

那么为什么在下面的情况下,即使对象与Foo.class和f1和f2不同,Threads也无法同时访问该方法?

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 个答案:

答案 0 :(得分:1)

  

2个方法m1是非静态同步的,m2是静态的   同步和2个线程T1访问m1与对象o1和T2   访问m2可以同时运行,因为m1和m2是同步的   2个不同的对象。

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

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

答案 1 :(得分:0)

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

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

当您想要限制并发性以便所有线程可以轮流访问资源时,使用同步