java锁机制(一)-----------Synchronized初探

来源:互联网 发布:淘宝客软件购买多少钱 编辑:程序博客网 时间:2024/06/06 09:10

(1)synchronized关键字的作用域有二种:
        A,某个对象实例内。synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法,相当于每一次运行到这个方法,都要检查有没有其它正在用这个方法的程序,有的话要等其它运行完这个方法后再运行此线程;没有的话,直接运行(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。但是,不同的对象实例的synchronized方法是不相干扰的,也就是说其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法。
        B,某个类的范围。synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。综合以上两点可以得出结论,synchronized修饰在静态方法上表示调用前要获得类的锁,而在非静态方法上表示调用此方法前要获得对象的锁。
(2)除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是:private final Object mLock = new Object(); ........... synchronized(syncObject){/*区块*/},它的作用域是当前对象,syncObject可以是类实例或类(如果代码段所在函数是static的,则syncObject本身也要有static修饰,否则提示:non-static variable syncObject cannot be referenced from a static context)。

(3)关于死锁。多个代码段加锁的目的就是为了这几个代码段之间互斥执行,如果一个synchronized(syncObject)代码段中的函数调用了另一个函数B,而函数B中也有synchronized(syncObject)代码段,这就造成了死锁。因为两者约束了同一个syncObject。

(4)关于synchronized(this)

一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
五、以上规则对其它对象锁同样适用。

0 0
原创粉丝点击