gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 24 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Java中使用synchronized关键字实现简单同步操作示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

简单记录下java中synchronized关键字的使用方法.

在介绍之前需要明确下java中的每一个类的对象实例都有且只有一个锁(lock)和之相关联,synchronized关键字只作用于该锁,即可以认为synchronized只对java类的对象实例起作用.

synchronized修饰函数 。

复制代码代码如下:

public synchronized aMethod(){
}

这就是最常用的情景,那么这个同步方法的用途是啥,为了方便就记作aMethod方法.

  。

1、synchronized锁定的是调用这个同步方法的对象实例,举个例子,同一个实例P1在不同线程中都调用aMethod时会产生同步; 2、需要注意的是这个对象所属的类的另一对象P2却能够任意调用这个aMethod,因为不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的aMethod方法; 3、如果一个对象有多个synchronized方法,比如aMethod、bMethod、cMethod,现在只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法.

上述代码其实等价于下面:

复制代码代码如下:

public void aMethod() {   
    synchronized (this) { 
    }   
}

这里的this就是指的该实例对象的引用,如P1。可见同步方法实质是将synchronized作用于object reference。那个拿到了P1对象锁的线程,才能够调用P1的同步方法,而对P2而言,P1这个锁和他毫不相干,程序也可能在这种情形下摆脱同步机制的控制,造成数据混乱。由此我们引出了下面的同步块.

  。

synchronized修饰代码块 。

复制代码代码如下:

public void dMethod(SomeObject so) {   
    synchronized(so) {
    }   
}

在这里synchronized获得锁就是so这个对象的锁,因而谁拿到这个锁谁就能够运行他所控制的那段代码。当有一个明确的对象作为锁时,就能够这样写程式,但当没有明确的对象作为锁,只是想让一段代码同步时,能够创建一个特别的instance变量(他得是个对象)来充当锁:

复制代码代码如下:

class Foo implements Runnable {
    private byte[] lock = new byte[0];
    Public void method() {
        synchronized(lock) {
        }
    }
}

零长度的byte数组对象创建起来将比任何对象都经济高效.

  。

synchronized修饰静态方法 。

前面提到了synchronized关键字只对不同线程中的P1实例有效,那如何可以同时对P1和P2不同实例有效呢,答案就是使用synchronized修饰静态方法,类的静态方法可以说是这个类自有的,并不依赖类的实例,所以我们只要对类的静态方法使用synchronized关键字来修饰就可以达到不同实例间的同步了.

最后此篇关于Java中使用synchronized关键字实现简单同步操作示例的文章就讲到这里了,如果你想了解更多关于Java中使用synchronized关键字实现简单同步操作示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com