【JUC】synchronizated和lock的区别&新lock的优势
原始构成
synchronized是关键字,属于JVM层面
javap -c 的结果显示

synchronized是可重入锁
11:是正常退出 17:是异常退出【保证不产生死锁和底层故障】
Lock是java.util.concurrent.locks包中的一个接口 是API层面的锁

使用方法
synchronized不需要手动释放锁,当synchronized代码执行完后系统自动让线程释放对锁的占用
ReentrantLock则需要用户手动释放没有主动释放的锁,可能出现死锁现象。需要lock、unlock和try/catch一起使用
等待是否可中断
synchronizated不可中断,除非抛出异常或者正常运行完成
reentrantLock可中高端
- 设置超时方法tryLock 【new ReentrantLock().tryLock(1,TimeUnit.SECONDS);】
- lockInterruptibly()放代码块中,调用interrupt()方法中断【new ReentrantLock().lockInterruptibly();】
是否是公平锁
synchronizated是非公平锁
reentrantLock源码:默认是非公平锁。也可以传参true为公平锁 false为非公平锁
/**
* Creates an instance of {@code ReentrantLock}.
* This is equivalent to using {@code ReentrantLock(false)}.
*/
public ReentrantLock() {
sync = new NonfairSync();
} /**
* Creates an instance of {@code ReentrantLock} with the
* given fairness policy.
*
* @param fair {@code true} if this lock should use a fair ordering policy
*/
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
锁是否绑定多个条件Condition
synchronizated没有,只能随机唤醒一个(notify()),或者唤醒全部唤醒(notifyAll())
ReentrantLock用来实现分组唤醒需要唤醒的线程,可以精确唤醒某个线程。
例如:多线程之间按顺序调用 实现线程之间按顺序启动【精确唤醒的举例】
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* 一个拍照的景点 有3个人要按顺序排单人照
* 张三想要拍1张 李四想要拍3张 王五想要拍5张
* 他们按照这个顺序排了两个景点
*/
class Plat{
private int id = 1; // 3人的编号
private Lock lock = new ReentrantLock();
private Condition person1 = lock.newCondition();
private Condition person2 = lock.newCondition();
private Condition person3 = lock.newCondition();
public void person1TakePhoto(){
lock.lock();
try{
while (id != 1){
person1.await();
}
for (int i = 0; i < 1; i++) {
System.out.println(Thread.currentThread().getName()+ "拍了"+(i+1)+"张照片");
}
id = 2;
person2.signal();
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}
public void person2TakePhoto(){
lock.lock();
try{
while (id != 2){
person2.await();
}
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName()+ "拍了"+(i+1)+"张照片");
}
id = 3;
person3.signal();
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}
public void person3TakePhoto(){
lock.lock();
try{
while (id != 3){
person3.await();
}
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+ "拍了"+(i+1)+"张照片");
}
id = 1;
person1.signal();
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
} }
public class ReentantLockTest {
public static void main(String[] args) throws InterruptedException {
Plat plat = new Plat();
new Thread(()->{
for (int i = 0; i < 2; i++) {
plat.person1TakePhoto();
}
},"张三").start();
new Thread(()->{
for (int i = 0; i < 2; i++) {
plat.person2TakePhoto();
}
},"李四").start();
new Thread(()->{
for (int i = 0; i < 2; i++) {
plat.person3TakePhoto();
}
},"王五").start();
}
}
输出结果:
张三拍了1张照片
李四拍了1张照片
李四拍了2张照片
李四拍了3张照片
王五拍了1张照片
王五拍了2张照片
王五拍了3张照片
王五拍了4张照片
王五拍了5张照片
张三拍了1张照片
李四拍了1张照片
李四拍了2张照片
李四拍了3张照片
王五拍了1张照片
王五拍了2张照片
王五拍了3张照片
王五拍了4张照片
王五拍了5张照片
【JUC】synchronizated和lock的区别&新lock的优势的更多相关文章
- 第44天学习打卡(JUC 线程和进程 并发和并行 Lock锁 生产者和消费者问题 如何判断锁(8锁问题) 集合类不安全)
什么是JUC 1.java.util工具包 包 分类 业务:普通的线程代码 Thread Runnable 没有返回值.效率相比Callable相对较低 2.线程和进程 进程:一个程序.QQ.exe, ...
- 详解synchronized与Lock的区别与使用
知识点 1.线程与进程 在开始之前先把进程与线程进行区分一下,一个程序最少需要一个进程,而一个进程最少需要一个线程.关系是线程–>进程–>程序的大致组成结构.所以线程是程序执行流的最小单位 ...
- 锁、C#中Monitor和Lock以及区别
1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 ...
- C#知识点总结系列:4、C#中Monitor和Lock以及区别
Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...
- C#中Monitor和Lock以及区别
Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...
- hibernate中load,get;find,iterator;merge,saveOrUpdate,lock的区别
hibernate中load,get;find,iterator;merge,saveOrUpdate,lock的区别 转自http://www.blogjava.net/bnlovebn/archi ...
- Java中synchronized和Lock的区别
synchronized和Lock的区别synchronize锁对象可以是任意对象,由于监视器方法必须要拥有锁对象那么任意对象都可以调用的方法所以将其抽取到Object类中去定义监视器方法这样锁对象和 ...
- 【Java】synchronized与lock的区别
从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock. 也许有朋友会问,既然都可以通过synchronized来实现同步访问了 ...
- Synchronize 和 Lock 的区别与用法
一.synchronized和lock的用法区别 (1)synchronized(隐式锁):在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要 ...
随机推荐
- 算法竞赛进阶指南--在单调递增序列a中查找小于等于x的数中最大的一个(即x或x的前驱)
在单调递增序列a中查找<=x的数中最大的一个(即x或x的前驱) while (l < r) { int mid = (l + r + 1) / 2; if (a[mid] <= x) ...
- JWT的浅谈
在实际工作过程中,运行jmeter脚本的时候,开发给了一个jwt的授权信息,到底是做什么用的呢,翻阅了一些资料,整理如下: 一.JWT(Json Web Token)是什么 JWT是一串格式为xxxx ...
- IoTClient开发6 - S7-200SmarTcp协议客户端实现
环境和工具 服务端电脑IP:192.168.1.130 客户端电脑IP:192.168.1.120 1.在服务端电脑运行IoTClientTool 2.运行Wireshark 3.在客户端电脑运行Io ...
- 前端——localStorage详细总结
一.localStorage简介: 在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题(cookie中每条cooki ...
- dfs+线段树 zhrt的数据结构课
zhrt的数据结构课 这个题目我觉得是一个有一点点思维的dfs+线段树 虽然说看起来可以用树链剖分写,但是这个题目时间卡了树剖 因为之前用树剖一直在写这个,所以一直想的是区间更新,想dfs+线段树,有 ...
- 一条SQL的执行流程
- Linux Charger IC 驱动移植总结
Linux Charger IC 驱动移植总结 文章目录 Linux Charger IC 驱动移植总结 1 设备树的基本知识 设备树的概念 设备树的基本结构 compatible属性 举个栗子 2 ...
- C# 委托delegate的基本用法
委托:就是一个方法的类型,下面3个调用情况来详细熟悉一下: 1.调用组合委托 //委托:就是一个方法的类型 public delegate int TestDelegateStr(); public ...
- Java中this()和super()
Java关键字this只能用于方法体中.this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this,并且this只和特定的对象关联,而不和类关联,同一个类的不同对象有不同的th ...
- 2018-08-26 jQuery与javaScript的区别及核心方法
1.jq对象就是js new Object 生成的普通对象. 2.jq对象与js对象,他们的方法不能共用! 3.jq对象与js对象的相互转化: js对象转jq对象 -> $(js_obj);// ...