原始构成

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的优势的更多相关文章

  1. 第44天学习打卡(JUC 线程和进程 并发和并行 Lock锁 生产者和消费者问题 如何判断锁(8锁问题) 集合类不安全)

    什么是JUC 1.java.util工具包 包 分类 业务:普通的线程代码 Thread Runnable 没有返回值.效率相比Callable相对较低 2.线程和进程 进程:一个程序.QQ.exe, ...

  2. 详解synchronized与Lock的区别与使用

    知识点 1.线程与进程 在开始之前先把进程与线程进行区分一下,一个程序最少需要一个进程,而一个进程最少需要一个线程.关系是线程–>进程–>程序的大致组成结构.所以线程是程序执行流的最小单位 ...

  3. 锁、C#中Monitor和Lock以及区别

    1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 ...

  4. C#知识点总结系列:4、C#中Monitor和Lock以及区别

    Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...

  5. C#中Monitor和Lock以及区别

    Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...

  6. hibernate中load,get;find,iterator;merge,saveOrUpdate,lock的区别

    hibernate中load,get;find,iterator;merge,saveOrUpdate,lock的区别 转自http://www.blogjava.net/bnlovebn/archi ...

  7. Java中synchronized和Lock的区别

    synchronized和Lock的区别synchronize锁对象可以是任意对象,由于监视器方法必须要拥有锁对象那么任意对象都可以调用的方法所以将其抽取到Object类中去定义监视器方法这样锁对象和 ...

  8. 【Java】synchronized与lock的区别

    从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock. 也许有朋友会问,既然都可以通过synchronized来实现同步访问了 ...

  9. Synchronize 和 Lock 的区别与用法

    一.synchronized和lock的用法区别 (1)synchronized(隐式锁):在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要 ...

随机推荐

  1. 【万字长文】别再报班了,一篇文章带你入门Python

    本文始发于个人公众号:TechFlow,原创不易,求个关注 最近有许多小伙伴后台联系我,说目前想要学习Python,但是没有一份很好的资料入门.一方面的确现在市面上Python的资料过多,导致新手会不 ...

  2. CF思维联系--CodeForces - 218C E - Ice Skating (并查集)

    题目地址:24道CF的DIv2 CD题有兴趣可以做一下. ACM思维题训练集合 Bajtek is learning to skate on ice. He's a beginner, so his ...

  3. java基础知识备忘

    1.java内存分配 a.寄存器cup -- 暂不涉及 b.本地方法栈  -- 虚拟机调用windows功能用的,比如创建文件夹 c.方法区  -- 存放 .class文件,负责存放方法 d.栈 -- ...

  4. 解决虚拟机中linux系统无法使用本机无线wifi联网的问题

    VMware Workstation 在嵌入式开发中经常会遇到,但是显示大多数人使用开发环境是Win10 + 无线网卡,针对这种情况,需要配置虚拟机的上网环境使用的是NAT模式,将配置过程进行描述: ...

  5. Fibonacci相关问题

    公式如下: 递归的解法我就不写了,贴一个递推的. long long Fibonacci(unsigned int n) { ) ; ) ; ; ; long long res; ; i <= ...

  6. 威联通(NAS)应用篇:自建OwnCloud网盘(百度网盘,拜拜~~~)

    基础环境: 威联通一台 已安装好 ContainerStation 公网 IP(非必须) 自有公网域名 下载镜像文件 提醒:建议先把威联通的自带镜像源改为国内的阿里云镜像源,教程:https://ww ...

  7. Android P HIDL demo代码编写 (原创)

    之前的文章已经分析了HIDL服务的注册和调用,这篇文章来总结下一个HIDL的服务如何编写. 缩写HAL文件 首先要确认放置文件夹和接口的包名,因为这跟后面使用脚本生成一部分代码有关,一般默认的放在ha ...

  8. Hadoop入门学习笔记-第一天 (HDFS:分布式存储系统简单集群)

    准备工作: 1.安装VMware Workstation Pro 2.新建三个虚拟机,安装centOS7.0 版本不限 配置工作: 1.准备三台服务器(nameNode10.dataNode20.da ...

  9. 近期总结的一些Java基础

    1.面向过程:当需要实现一个功能的时候,每一个过程中的详细步骤和细节都要亲力亲为. 2.面向对象:当需要实现一个功能的时候,不关心详细的步骤细节,而是找人帮我做事. 3.类和对象的关系:   a-类是 ...

  10. Spring cloud系列教程第二篇:支付项目父工程图文搭建

    Spring cloud系列教程第二篇:支付项目父工程图文搭建 在讲解spring cloud相关的技术的时候,咱们就模拟订单支付这个流程来讲讲 在这个支付模块微服务搭建过程中,上面的这些技术,都会融 ...