synchronized、volatile、lock

2024-08-21 05:32
文章标签 synchronized lock volatile

本文主要是介绍synchronized、volatile、lock,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:https://blog.csdn.net/u012102104/article/details/79231159

1、synchronized

(1)修饰方法:每次只能有一个线程进入该方法,此时线程获得的是成员锁。

public synchronized void syncMethod() {//doSomething
}

(2)修饰代码块:每次只能一个线程进入该代码,此时线程获得成员锁。

public int synMethod(int arg){synchronized(arg) {//doSomething}
}

(3)修饰对象:如果当前线程进入,那么其他线程在该类所有对象上的任何操作都不能进行,此时当前线程获得的是对象锁。

public class SyncThread implements Runnable {public static void main(String args[]) {SyncThread syncThread = new SyncThread();Thread therad1 = new Thread(syncThread, "therad1");Thread therad2 = new Thread(syncThread, "therad2");Thread therad3 = new Thread(syncThread, "therad3");therad1.start();therad2.start();therad3.start();}public void run() {synchronized (this) {System.out.println(Thread.currentThread().getName());}}
}

(4)修饰类:如果当前线程进入,那么其他线程在该类中所有操作不能进行,包括静态变量和静态方法,此时当前线程获得的是对象锁。

public class syncClass {public void method() {synchronized(syncClass.class) {//doSomething}}
}

2、volatile

volatile 关键字的作用是禁止指令的重排序,强制从公共堆栈中取得变量的值,而不是从线程私有的数据栈中取变量的值。 

volatile与synchronized的区别如下:

  • volatile 不会发生线程阻塞,而 synchronized 会发生线程阻塞。
  • volatile 只能修饰变量,而 synchronized 可以修饰方法、代码块等。
  • volatile 不能保证原子性(不能保证线程安全),而 synchronized 可以保证原子性。
  • volatile 解决的是变量在多线程之间的可见性,而 synchronized 解决的是多线程之间访问资源的同步性。
     

3、lock

synchronized隐式锁,在需要同步的对象中加入此控制,而lock显示锁,需要显示指定起始位置和终止位置。

  • 使用lock时在finally中必须释放锁,不然容易造成线程死锁;而使用synchronized时,获取锁的线程会在执行完同步代码后释放锁(或者JVM会在线程执行发生异常时释放锁)。
  • 使用lock时线程不会一直等待;而使用synchronized时,假设A线程获得锁后阻塞,其他线程会一直等待。
  • lock可重入、可中断、可公平也可不公平;而synchronized可重入但不可中断、非公平。 
     

 

这篇关于synchronized、volatile、lock的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092259

相关文章

关键字synchronized、volatile的比较

关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。随着JDK新版本的发布,synchronized关键字的执行效率上得到很大提升,在开发中使用synchronized关键字的比率还是比较大的。多线程访问volatile不会发生阻塞,而synchronize

面试官:synchronized的锁升级过程是怎样的?

大家好,我是大明哥,一个专注「死磕 Java」系列创作的硬核程序员。 回答 在 JDK 1.6之前,synchronized 是一个重量级、效率比较低下的锁,但是在JDK 1.6后,JVM 为了提高锁的获取与释放效,,对 synchronized 进行了优化,引入了偏向锁和轻量级锁,至此,锁的状态有四种,级别由低到高依次为:无锁、偏向锁、轻量级锁、重量级锁。 锁升级就是无锁 —>

关键字volatile有什么含意?

1. 并行设备的硬件寄存器。存储器映射的硬件寄存器通常加volatile,因为寄存器随时可以被外设硬件修改。当声明指向设备寄存器的指针时一定要用volatile,它会告诉编译器不要对存储在这个地 址的数据进行假设,也就是要去相应的内存地址里取。 2. 一个中断服务程序中修改的供其他程序检测的变量。volatile提醒编译器,它后面所定义的变量随时都有可能改变。因此编译后的程序每次需要存储或读取这

【Java编程的思想】理解synchronized

用法和基本原理 synchronized可以用于修饰类的实例方法、静态方法和代码块 实例方法 在介绍并发基础知识的时候,有一部分是关于竞态条件的,当多个线程访问和操作同一个对象时,由于语句不是原子操作,所以得到了不正确的结果。这个地方就可以用synchronized进行处理 public class Counter {private int count;public synchroni

java内存模型及volatile关键字

文章目录 一、基本概念二、java内存模型三、volatile关键字 一、基本概念 在并发编程过程中,我们经常会遇到三类问题:原子性问题,可见性问题,有序性问题。下面我们来介绍一下和这些问题相关的三个概念。 1.原子性 也就是执行一个操作,要不全部执行成功,要不执行失败。比如a=0,这个操作就是原子性的,要么赋值成功,要么赋值失败。再比如a++操作,这个操作就不是原子性的,它是三

【硬刚Java并发】JUC基础(六):Lock 同步锁

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的Java并发部分补充。 显示锁 Lock 在 Java 5.0 之前,协调共享对象的访问时可以使用的机制只有 synchronized 和 volatile 。Java 5.0 后增加了一些新的机制,但并不是一种替代内置锁的方法,而是当内置锁不适用时,作为一种可选择的高级功能。 ReentrantLock 实

【大数据Java基础- Java并发 20】深入分析synchronized的实现原理

记得刚刚开始学习Java的时候,一遇到多线程情况就是synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是,随着我们学习的进行我们知道synchronized是一个重量级锁,相对于Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它。 诚然,随着Javs S

解决 The sandbox is not sync with the Podfile.lock问题

问题描述: github / sourcetree下载的Demo,很多时候使用到CocoaPods,有的时候因为依赖关系或者版本问题不能编译运行。出现例如The sandbox is not sync with the Podfile.lock问题时候,如下所示 diff: /../Podfile.lock: No such file or directory diff: Manifest.l

【PostgreSQL教程】PostgreSQL 高级篇之 LOCK(锁)

博主介绍:✌全网粉丝20W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可以先关注收藏起来,在工作中、生活上等遇到相关问题都可以给我

在 python3 中使用 multiprocessing,加上锁,却发现锁没用,怎么办?Lock 多进程 多线程 锁 LOCK lock

multiprocessing 是多进程库,而不同进程之间的全局变量是不共享的,所以,这也是为什么当你对 python3 全局变量加上锁的时候会失效。 正确处理方式如下: 使用 multiprocessing.Value 和 multiprocessing.Array 来共享数据,可以使进程池中的所有进程能够正确访问和修改共享数据。 代码如下 import multiprocessing#