源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Java中使用synchronized关键字实现简单同步操作示例

  • 时间:2021-09-24 15:23 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Java中使用synchronized关键字实现简单同步操作示例
简单记录下java中synchronized关键字的使用方法。 在介绍之前需要明确下java中的每一个类的对象实例都有且只有一个锁(lock)和之相关联,synchronized关键字只作用于该锁,即可以认为synchronized只对java类的对象实例起作用。 [b]synchronized修饰函数 [/b]
[u]复制代码[/u] 代码如下:
public synchronized aMethod(){ }
这就是最常用的情景,那么这个同步方法的用途是啥,为了方便就记作aMethod方法。 1、synchronized锁定的是调用这个同步方法的对象实例,举个例子,同一个实例P1在不同线程中都调用aMethod时会产生同步; 2、需要注意的是这个对象所属的类的另一对象P2却能够任意调用这个aMethod,因为不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的aMethod方法; 3、如果一个对象有多个synchronized方法,比如aMethod、bMethod、cMethod,现在只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法。 上述代码其实等价于下面:
[u]复制代码[/u] 代码如下:
public void aMethod() {       synchronized (this) {     }   }
这里的this就是指的该实例对象的引用,如P1。可见同步方法实质是将synchronized作用于object reference。那个拿到了P1对象锁的线程,才能够调用P1的同步方法,而对P2而言,P1这个锁和他毫不相干,程序也可能在这种情形下摆脱同步机制的控制,造成数据混乱。由此我们引出了下面的同步块。 [b]synchronized修饰代码块 [/b]
[u]复制代码[/u] 代码如下:
public void dMethod(SomeObject so) {       synchronized(so) {     }   }
在这里synchronized获得锁就是so这个对象的锁,因而谁拿到这个锁谁就能够运行他所控制的那段代码。当有一个明确的对象作为锁时,就能够这样写程式,但当没有明确的对象作为锁,只是想让一段代码同步时,能够创建一个特别的instance变量(他得是个对象)来充当锁:
[u]复制代码[/u] 代码如下:
class Foo implements Runnable {     private byte[] lock = new byte[0];     Public void method() {         synchronized(lock) {         }     } }
零长度的byte数组对象创建起来将比任何对象都经济高效。 [b]synchronized修饰静态方法[/b] 前面提到了synchronized关键字只对不同线程中的P1实例有效,那如何可以同时对P1和P2不同实例有效呢,答案就是使用synchronized修饰静态方法,类的静态方法可以说是这个类自有的,并不依赖类的实例,所以我们只要对类的静态方法使用synchronized关键字来修饰就可以达到不同实例间的同步了。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部