繁体   English   中英

多线程同步

[英]Synchronization in multi threading

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

因为m1和m2在2个不同的对象上同步,所以2种方法m1是非静态同步的,而m2是静态同步的,并且2条线程T1通过对象o1访问m1,而T2访问m2可以同时运行。

那么,为什么在以下情况下,即使对象与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(); 
    }
}

因为m1和m2在2个不同的对象上同步,所以2种方法m1是非静态同步的,而m2是静态同步的,并且2条线程T1通过对象o1访问m1,而T2访问m2可以同时运行。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM