当前位置: 首页 > 编程笔记 >

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

谷梁宏恺
2023-03-14
本文向大家介绍Java中使用synchronized关键字实现简单同步操作示例,包括了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关键字修饰方法同步的用法详解的使用技巧和注意事项,需要的朋友参考一下 Java的最基本的同步方式,即使用synchronized关键字来控制一个方法的并发访问。 每一个用synchronized关键字声明的方法都是临界区。在Java中,同一个对象的临界区,在同一时间只有一个允许被访

  • 本文向大家介绍Java实现的简单字符串反转操作示例,包括了Java实现的简单字符串反转操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java实现的简单字符串反转操作。分享给大家供大家参考,具体如下: 最常用的方式是,反向取出每个字符,然后打印: 运行结果: 原始的字符串:A quick brown fox jumps over the lazy dog. 反转后字符串:.god

  • 本文向大家介绍java synchronized关键字的用法,包括了java synchronized关键字的用法的使用技巧和注意事项,需要的朋友参考一下 0.先导的问题代码     下面的代码演示了一个计数器,两个线程同时对i进行累加的操作,各执行1000000次.我们期望的结果肯定是i=2000000.但是我们多次执行以后,会发现i的值永远小于2000000.这是因为,两个线程同时对i进行写入

  • 问题内容: 所以我正在用关键字测试。这是我尝试的示例: 当我运行它时,来自两个线程的调用方法的输出生成以下输出: 当我将方法更改为: 我得到以下输出: 尽管这使我清楚地了解的目的,但我想知道还有其他可以使用的原因。还是我在这里所做的,是为什么我们需要使用此关键字的唯一原因? 谢谢。 编辑: 令我感到困惑的另一件事是,在第一个输出中,为什么计数器在7之后变为3。这对我来说似乎有点不可能,但是每次尝试

  • 本文向大家介绍Java中的同步关键字,包括了Java中的同步关键字的使用技巧和注意事项,需要的朋友参考一下 当我们在程序中启动两个或多个线程时,可能会出现多个线程尝试访问同一资源,最终由于并发问题,它们可能产生无法预料的结果的情况。例如,如果多个线程试图在同一文件中写入数据,则它们可能会破坏数据,因为其中一个线程可以覆盖数据,或者一个线程同时打开同一文件时,另一个线程可能正在关闭同一文件。 因此,

  • 本文向大家介绍详解java中的synchronized关键字,包括了详解java中的synchronized关键字的使用技巧和注意事项,需要的朋友参考一下 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到