synchronized

来源:互联网 发布:怎么签署淘宝空间协议 编辑:程序博客网 时间:2024/05/22 01:27

无论synchronized关键字加在方法上还是对象上,他锁住的都是对象。

所以一个类中如果有2个或者多个synchronized修饰的方法时,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问也将被阻塞。所以银行账户的例子中,存钱或者取钱的方法必须要加synchronized,也就是账户在调用存钱方法的时候不可能同时调用取钱方法。查询的方法可以不加synchronized,查询并没有改变账户的balance,只是读取而已。所以在取钱或者存钱的同时可以同时做查询。

如果synchronized锁住的是一个ArrayList对象,那么锁住此arraylist对象的多处代码不能被多个线程同时访问


总结,无论synchronized修饰的是方法还是代码块,其实锁住的就是对象。无论这个对象是object还是arraylist,只要其中一处被锁住的代码块正在被一个线程访问,那么其他线程对被锁住的代码(包括当前正在被访问的代码块和其他被synchronized修饰的但是没有正被访问的代码块)的访问会被阻塞。


synchronized的代码块越小,多线程访问的时候效率越高。


 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

     二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

     三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。

     四、第三个例子同样适用其它同步代码块(synchronized(arraylist)。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。

     五、以上规则对其它对象锁同样适用.


0 0
原创粉丝点击