1,原始构成
synchronized是关键字,属于JVM层面,通过wait,notify和notifyAll来调度线程。
Lock是具体类,是api层面的锁。
2,使用方法
synchronized不需要用户手动去释放锁, 当synchronized代码执行完后,系统会自动释放锁。
Lock需要用户手动释放锁,否则会出现死锁现象。需要lock和unlock配合try/finally语句块来完成。
3,等待是否中断
synchronized不可中断,除非抛出异常或者正常运行完毕。
Lock可中断,可以设置超时方法或者调用中断方法。
4,加锁是否公平
synchronized非公平锁。
Lock默认非公平锁,可指定为公平锁。
5,锁绑定多个条件condition
synchronized没有。
Lock用来分组唤醒需要唤醒的线程,可以精确唤醒,而不是像synchronized一样要么随机唤醒一个线程,要么全部唤醒。
Demo: 练习
多线程之间按顺序调用,实现A->B->C三个线程启动,要求:AA打印5次,BB打印10次,CC打印15次,重复10遍。
package com.demo.lock; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class ShareResource{ int number = 1; private Lock lock = new ReentrantLock(); private Condition c1 = lock.newCondition(); private Condition c2 = lock.newCondition(); private Condition c3 = lock.newCondition(); public void print5(){ lock.lock(); try { while(number!=1){ c1.await(); } for(int i=1;i<=5;i++){ System.out.println(Thread.currentThread().getName()+"\t"+i); } number = 2; c2.signal(); } catch (Exception e) { e.printStackTrace(); }finally{ lock.unlock(); } } public void print10(){ lock.lock(); try { while(number!=2){ c2.await(); } for(int i=1;i<=10;i++){ System.out.println(Thread.currentThread().getName()+"\t"+i); } number = 3; c3.signal(); } catch (Exception e) { e.printStackTrace(); }finally{ lock.unlock(); } } public void print15(){ lock.lock(); try { while(number!=3){ c3.await(); } for(int i=1;i<=15;i++){ System.out.println(Thread.currentThread().getName()+"\t"+i); } number = 1; c1.signal(); } catch (Exception e) { e.printStackTrace(); }finally{ lock.unlock(); } } } public class TestReentrantLock { public static void main(String[] args) { ShareResource shareResource = new ShareResource(); new Thread(()->{ for(int i=1;i<=10;i++){ shareResource.print5(); } },"AA").start(); new Thread(()->{ for(int i=1;i<=10;i++){ shareResource.print10(); } },"BB").start(); new Thread(()->{ for(int i=1;i<=10;i++){ shareResource.print15(); } },"CC").start(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍简单了解synchronized和lock的区别,包括了简单了解synchronized和lock的区别的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了简单了解synchronized和lock的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类别 synchronized Lock 存在层次 Java的关键字 一个
本文向大家介绍浅谈Synchronized和Lock的区别,包括了浅谈Synchronized和Lock的区别的使用技巧和注意事项,需要的朋友参考一下 如下所示: Synchronized是内置的java关键字,Lock是一个java类。 Synchronized无法判断是否获取到了锁,Lock可以判断是否获取到了锁。 Synchronized会自动释放锁,Lock必须手动释放锁。 Synchro
本文向大家介绍synchronized 和 Lock 有什么区别?相关面试题,主要包含被问及synchronized 和 Lock 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 synchronized 可以给类、方法、代码块加锁;而 lock 只能给代码块加锁。 synchronized 不需要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁;而 lock 需要自己加锁
本文向大家介绍Java 多线程Synchronized和Lock的区别,包括了Java 多线程Synchronized和Lock的区别的使用技巧和注意事项,需要的朋友参考一下 引言 在多线程中,为了使线程安全,我们经常会使用synchronized和Lock进行代码同步和加锁,但是具体两者有什么区别,什么场景下适合用什么可能还不大清楚,主要的区别大致如下: 区别 1、synchroni
本文向大家介绍详谈Lock与synchronized 的区别,包括了详谈Lock与synchronized 的区别的使用技巧和注意事项,需要的朋友参考一下 1、lock是可中断锁,而synchronized 不是可中断锁 线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的锁定, 如果使用 synchronized ,如果A不释放,B将一直等下去,不能被中断 如果 使用Ree
本文向大家介绍使用synchronized实现一个Lock代码详解,包括了使用synchronized实现一个Lock代码详解的使用技巧和注意事项,需要的朋友参考一下 刚看到这个题目的时候无从下手,因为觉得synchronized和lock在加锁的方式上有很大不同,比如,看看正常情况下synchronized时如何加锁的。 方式一: 方式二: 从这两种方式来看,锁都是加在{}之间的,我们再来看看L