并发编程--锁--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中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...
随机推荐
- 【题解】AcWing 193. 算乘方的牛
原题链接 题目描述 约翰的奶牛希望能够非常快速地计算一个数字的整数幂P(1 <= P <= 20,000)是多少,这需要你的帮助. 在它们计算得到最终结果的过程中只能保留两个工作变量用于中 ...
- Codeforces Edu Round 52 A-E
A. Vasya and Chocolate 模拟题.数据会爆\(int\),要开\(long\) \(long\) #include <iostream> #include <cs ...
- SseEmitter推送
后端代码SseController.java package com.theorydance.mywebsocket.server; import java.util.HashMap; import ...
- Day5 - 07 函数的参数-参数组合
现在我们学完了位置参数.默认参数.可变参数.关键字参数.命名关键字参数五种参数类型.在Python中定义函数,可以使用这五种参数进行组合.但是参数定义的顺序必须是:必选参数.默认参数.可变参数.命名关 ...
- gnuplot名词缩写
http://blog.163.com/yucheng_xiao/blog/static/7660019220141017114630822/ with 缩写成 w lt 是 linetype 的缩 ...
- Linux命令-1.远程登录
原网站:http://www.runoob.com/linux/linux-remote-login.html Linux一般作为服务器使用,而服务器一般放在机房,你不可能在机房操作你的Linux服务 ...
- html 10-HTML基础回顾
10-HTML基础回顾 #本文主要内容 html 的常见元素 html 元素的分类 html 元素的嵌套关系 html 元素的默认样式和 CSS Reset html 常见面试题 #html 的常见元 ...
- [GXYCTF2019]simple CPP
[GXYCTF2019]simple CPP 一.查壳 无壳,64位程序 二.IDA分析 找到主函数后动态调试,看的更清楚 经过调试后我们可以找到len就是储存字符串长度的变量,之后判断长度是不是大于 ...
- JavaScript之函数原型链完整版
我的上一篇文章有解释绅士原型及简单的原型链,在这里我将对原型链做完整讲述: // 函数的原型链: 把函数当对象(实例对象)来看 function Person(){} // 底层Function创建出 ...
- Java基础进阶:内部类lambda重点摘要,详细讲解成员内部类,局部内部类,匿名内部类,Lambda表达式,Lambda表达式和匿名内部类的区别,附重难点,代码实现源码,课堂笔记,课后扩展及答案
内部类lambda重点摘要 内部类特点: 内部类可以直接访问外部类,包括私有 外部类访问内部类必须创建对象 创建内部对象格式: 外部类.内部类 对象名=new外部类().new内部类(); 静态内部类 ...