并发编程--锁--Lock和Synchronized
说说对于 synchronized 关键字的了解?
synchronized关键字解决的是多个线程之间访问资源的同步性;
synchronized 关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。
synchronized保证了对变量操作的可见性,原子性和有序性。
synchronized 的使用方式有三种:
(1)修饰同步代码块
(2)修饰非静态(实例)的方法
(3)修饰静态的方法
eg;双重校验锁实现单例模式使用到了synchronized
菜鸟教程 --https://www.runoob.com/design-pattern/singleton-pattern.html
-- https://www.cnblogs.com/qdhxhz/p/9175159.html
-- https://new.qq.com/rain/a/20190923A058BQ00
Lock和synchronized的区别
(1)synchronized是Java中的关键字,在JVM层面,而Lock是一个接口;
(2)synchronized会自动释放线程占有的锁,而Lock需要主动通过unLock()去释放锁,否则可能造成死锁现象。
(3)使用synchronized时,等待的线程会一直等待下去,不能够响应中断,而Lock可以让等待锁的线程响应中断;
(4)通过Lock可以判断锁状态,即是否成功获取锁,而synchronized无法判断。
(5)Lock可以提高多个线程进行读操作的效率。
说明:在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况。
synchronized和Lock底层实现?
在 Java 中每个对象都隐式包含一个 monitor(监视器)对象,加锁的过程其实就是竞争 monitor 对象的过程,被synchronized修饰的代码块,在执行之前先使用monitorenter指令加锁,然后在执行结束之后再使用monitorexit指令释放锁资源,在整个执行期间此代码都是锁定的状态,这就是典型悲观锁的实现流程。
lock锁使用的是CAS和volatile来实现同步的,CAS使用硬件命令实现缓存一致性保证了原子性,volatile保证了可见性,多线程环境下所有的线程通过CAS进行竞争资源,只能有一个成功,其它的都会自旋。
synchronized 是哪种锁的实现?为什么?
答:synchronized 是悲观锁的实现,因为 synchronized 修饰的代码,每次执行时会进行加锁操作,同时只允许一个线程进行操作,所以它是悲观锁的实现。
synchronized 使用的是公平锁还是非公平锁?
答:synchronized 使用的是非公平锁,并且是不可设置的。公平锁由于有挂起和恢复所以存在一定的开销(非公平锁的吞吐量大于公平锁),因此性能不如非公平锁。,并且是主流操作系统线程调度的基本选择,所以这也是 synchronized 使用非公平锁原由。
volatile 对比 synchronized 有什么区别?
(1) synchronized即保证了数据的可见性也保证了原子性,volatile能保证对变量操作的可见性,但不能完全保证原子性。比如,i++ 如果使用 synchronized 修饰是线程安全的,而 volatile 会有线程安全的问题。
(2) volatile只能修饰变量,synchronized可以修饰变量,方法以及代码块。
(3) volatile在多线程中不会存在阻塞问题,synchronized会存在阻塞问题。
(4) volatile解决的是多个线程之间对变量操作的可见性,而synchroized解决的是多个线程之间访问资源的同步性。
推荐/参考:
拉钩教育 -- java面试真题及源码
https://kaiwu.lagou.com/course/courseInfo.htm?courseId=59#/detail/pc?id=1766
关键字synchronized解析 --
https://juejin.im/post/5b42c2546fb9a04f8751eabc
一文带你理解 Java 中 Lock 的实现原理 --
https://juejin.im/entry/5b9f0571f265da0a8f35b4bb
不可不说锁的事 --
https://tech.meituan.com/2018/11/15/java-lock.html
并发编程--锁--Lock和Synchronized的更多相关文章
- Java并发编程:Lock和Synchronized <转>
在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方 ...
- java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock
原文:java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock 锁 锁是用来控制多个线程访问共享资源的方式,java中可以使用synch ...
- [转载] java并发编程:Lock(线程锁)
作者:海子 原文链接: http://www.cnblogs.com/dolphin0520/p/3923167.html 出处:http://www.cnblogs.com/dolphin0520/ ...
- 并发编程 17—— Lock
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- 【多线程】Java并发编程:Lock(转载)
原文链接:http://www.cnblogs.com/dolphin0520/p/3923167.html Java并发编程:Lock 在上一篇文章中我们讲到了如何使用关键字synchronized ...
- Java并发编程:Lock(转)
本文转自:http://www.cnblogs.com/dolphin0520/p/3923167.html Java并发编程:Lock 在上一篇文章中我们讲到了如何使用关键字synchronized ...
- 5、Java并发编程:Lock
Java并发编程:Lock 在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.l ...
- 并发编程学习笔记(3)----synchronized关键字以及单例模式与线程安全问题
再说synchronized关键字之前,我们首先先小小的了解一个概念-内置锁. 什么是内置锁? 在java中,每个java对象都可以用作synchronized关键字的锁,这些锁就被称为内置锁,每个对 ...
- Java并发编程锁之独占公平锁与非公平锁比较
Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...
随机推荐
- 乌云1000个PHP代码审计案例(1)
前两天发现的宝藏网站:https://php.mengsec.com/ 在github上面找到了源代码:https://github.com/Xyntax/1000php,可以在自己的服务器上面搭建 ...
- C#声明一个100大小的数组 随机生成1-100之间不重复的数
面试题:C#声明一个100大小的数组 随机生成1-100之间不重复的数下面是C#的实现方式,编译测试通过 public static void InsertRandomArray() { int[] ...
- 测试与发布( Alpha版本 )
THE BUG 团队 杨梓琦 温海源 李华 陈杰才 郑堡恩 钟明康 软件说明 本软件用MYSQL数据库保存所有的数据内容,因此可以通过查询数据库查询功能是否正常进行. 测试过程 在测试过程中,左右两张 ...
- JavaScript一个一维数组变为两个一维数组
//例如[1,2,3,4,5,6,7,8]变为[[1,2,3,4],[5,6,7,8]] var arr=[1,2,3,4,5,6,7,8]; function fixedArray(arr) { v ...
- 开发实践丨用小熊派STM32开发板模拟自动售货机
摘要:本文内容是讲述用小熊派开发板模拟自动售货机,基于论坛提供的工程代码,通过云端开发和设备终端开发,实现终端数据在的华为云平台显示. 本文内容是讲述用小熊派开发板模拟自动售货机,基于论坛提供的工程代 ...
- AH/HNOI 2017 礼物
题目链接 描述 两个序列 \(x, y\),可以将一个序列每个值同时加非负整数 \(c\),其中一个序列可以循环移位,要求最小化: \[\sum_{i = 1}^{n}(x_i - y_i) ^ 2 ...
- fabric智能合约模板
以创建用户为例,我觉得基本都是这个框架,用特殊功能直接再往上加,欢迎留言交流 func createUser(stub shim.ChaincodeStubInterface, args []stri ...
- Java-静态关键字Static&静态代码块
静态成员变量:(static修饰变量) 如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类.多个对象共享同一份数据. 静态方法:(static修饰方法) 一旦使用 ...
- 漫谈 HTTP 性能优化
本文主要是侧重于 HTTP 的优化,对于 HTTPS 后续文章会讲. 既然要做性能优化,那么,我们就需要知道:什么是性能?它都有哪些指标,又应该如何度量,进而采取哪些手段去优化? "性能&q ...
- AWT04-AWT常用组件
1.基本组件 方法名 说明 Button 按钮 Canvas 用于绘画的画布 Checkbox 复选框组件 CheckboxGroup 用于将多个Checkbox合成一组,一组Checkbox只有一个 ...