目录

1.1 复习synchronized

1.2 Lock接口

1.3 Lock方法

1.4 两者差异


1.1 复习synchronized

他是Java的关键字,是一种同步锁,能够修饰 一个 对象,变量,方法,

来控制这个所修饰的,被顺序的访问,

 多线程的编程步骤:

   第一:创建一个资源类,属性和操作方法

   第二:创建多线程,调用类里面的操作方法

结合synchronized 锁 和 多线程的编程步骤实现卖票的功能 :(高内聚低耦合)

package Lock;
//多线程实现卖票的功能  synchronized方式class Ticket{ //第一步 资源类 票private int num =30; //定义票的数量public synchronized void sale(){  //synchronized//给这个资源加上锁,防止多线程的错误//资源的操作 卖票的方法if(num>0){System.out.println(Thread.currentThread().getName()+" 卖出了: 1张 还剩下"+(num--)); }}}public class SaleTicket {//第二步,创建多个线程,调用资源类的操作方法public static void main(String[] args) {Ticket ticket = new Ticket();Thread t1 = new Thread(new Runnable() {@Override  //具体创建线程的方法是new Thread(new Runnable({ 重写run方法},线程名)public void run() {for(int i =0; i<10;i++){ticket.sale();}}} ,"t1");t1.start();Thread t2= new Thread(Thread t2= new Thread(  //Lambda 表达式() ->{ for (int i = 0; i < 10; i++) {ticket.sale();} } ,"t2");t2.start();}
}

代码执行的时候,t1 和 t2两个线程执行堆叠在一起,这是因为不同线程不同对象启动执行,都可以访问

1.2 Lock接口

为锁和等待条件提供一个框架的接口和类,不同于内置同步和监视器, LOCK是类,可通过类实现同步访问,多个接口实现类:可重入锁等

lock的编程步骤同synchronized

可重入锁的代码定义private final ReentrantLock lock = new ReentrantLock(true);
上锁lock.lock();

解锁lock.unlock();
上锁与解锁中的代码如果出现异常,解锁会执行不了,所以最好加try..finally

//第一步  创建资源类,定义属性和和操作方法
class LTicket {private int num = 30; //票数量private final ReentrantLock lock = new ReentrantLock(true);  //创建可重入锁public void sale() {   //卖票方法//上锁lock.lock();try {if(number > 0) { //判断是否有票System.out.println(Thread.currentThread().getName()+" :卖出 1张 剩余:"+(num--));}} finally {//解锁lock.unlock();}}
}public class LSaleTicket {//第二步 创建多个线程,调用资源类的操作方法//创建三个线程public static void main(String[] args) {LTicket ticket = new LTicket();new Thread(()-> {for (int i = 0; i < 40; i++) {ticket.sale();}
},"AA").start();new Thread(()-> {for (int i = 0; i < 40; i++) {ticket.sale();}},"BB").start();new Thread(()-> {for (int i = 0; i < 40; i++) {ticket.sale();}},"CC").start();}
}

1.3 Lock方法

lock常用接口

public interface Lock {void lock();void lockInterruptibly() throws InterruptedException;boolean tryLock();boolean tryLock(long time, TimeUnit unit) throws InterruptedException;void unlock();Condition newCondition();
}

lock()方法用来获取锁

  • 如果锁已被其他线程获取,则进行等待
  • 发生异常不会自动解锁,需用在 try{}catch{}块中进行
lock.lock();
try{//处理任务
}catch(Exception ex){
}finally{lock.unlock(); //释放锁
}

Condition 类也可以实现等待/通知模式

关键字 synchronized 与 wait()/notify()这两个方法一起使用可以实现等待/通知模式,Lock 锁的 newContition()方法返回 Condition 对象,Condition 类也可以实现等待/通知模式

用 notify()通知时,JVM 会随机唤醒某个等待的线程, 使用 Condition 类可以进行选择性通知, Condition 比较常用的两个方法:

1.  await()会使当前线程等待,同时会释放锁,当其他线程调用 signal()时,线程会重新获得锁并继续执行
   2. signal()用于唤醒一个等待的线程

ReentrantLock 是唯一实现了 Lock 接口的类,并且 ReentrantLock 提供了更多的方法
ReentrantLock可重入锁

Reentrant  ReadWriteLock 里面提供了很多丰富的方法,不过最主要的有两个方法:readLock()和 writeLock()用来获取读锁和写锁
writeLock();来获取读锁
readLock();获取写锁

public interface ReadWriteLock {Lock readLock();Lock writeLock();
}

1.4 两者差异

synchronized与lock的异同:

1. synchronized是java关键字,内置,而lock不是内置,是一个类,可以实现同步访问

且 比 synchronized中的方法更加丰富
    2.synchronized不会手动释放锁,而lock需手动释放锁(不解锁会出现死锁,需要在 finally 块中释放锁)
   3. lock等待锁的线程会相应中断,而synchronized不会相应,只会一直等待
   4.  通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到
   5.   Lock 可以提高多个线程进行读操作的效率(当多个线程竞争的时候)

1. Lock (锁的)接口相关推荐

  1. Java 对synchronized的补充Lock锁

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

  2. 深入Lock锁底层原理实现,手写一个可重入锁

    synchronized与lock lock是一个接口,而synchronized是在JVM层面实现的.synchronized释放锁有两种方式: 获取锁的线程执行完同步代码,释放锁 . 线程执行发生 ...

  3. JUC多线程:synchronized锁机制原理 与 Lock锁机制

    前言: 线程安全是并发编程中的重要关注点,造成线程安全问题的主要原因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方案,当存在多 ...

  4. java 多线程 串行 加锁_java多线程 synchronized 与lock锁 实现线程安全

    如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样 的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 通过卖火车票的例子 火车站要卖票,我们 ...

  5. Java并发编程—JUC的Lock锁

    一.Lock (JUC锁) JUC 锁位于java.util.concurrent.locks包下,为锁和等待条件提供一个框架,它不同于内置同步和监视器. CountDownLatch,CyclicB ...

  6. java多线程安全解决方案_java常用知识:多线程安全问题的解决方法-Lock锁

    jdk1.5后出现的 两个方法: void Lock() void unlock() 使用步骤: 1.在成员位置创建一个ReentrantLock对象 2.在可能出现安全问题的代码前调用Lock接口中 ...

  7. 多线程笔记补充之线程通信wait和notify方法以及Lock和Condition接口的使用

    线程通信-wait和notify方法介绍: java.lang.Object类提供类两类用于操作线程通信的方法. wait():执行该方法的线程对象释放同步锁,JVM把该线程存放到等待池中,等待其他的 ...

  8. java 代码锁_Java中的Lock锁

    Lock锁介绍: 在java中可以使用 synchronized 来实现多线程下对象的同步访问,为了获得更加灵活使用场景.高效的性能,java还提供了Lock接口及其实现类ReentrantLock和 ...

  9. java并发,同步synchronize和lock锁的使用方法和注意,死锁案例分析

    1.什么是线程安全问题 多个线程同时共享同一个全局变量或者静态变量的时候,某个线程的写操作,可能会影响到其他线程操作这个变量.所有线程读一个变量不会产生线程安全问题. 实际场景就是火车站买票问题:剩余 ...

  10. Java并发包JUC的Lock锁讲解

    概述 Java有两种锁,一种是使用关键字Synchronized对方法或者代码块进行加锁,一种是使用接口Lock(实际上其实现类)进行上锁和解锁. 区别: Synchronized是java的一个关键 ...

最新文章

  1. python编写登录接口与三级菜单小程序
  2. fzu1062 洗牌问题(思路模拟)
  3. stm32f4 输出pwm波_stm32的pwm输出代码及注释
  4. python 字典字符串转字典——urllib.request.Request发送get,post请求,发送json参数
  5. unity让对象作为参数_unity-container – 一个unity容器可以将自身的引用作为构造函数参数传递吗?...
  6. qt多线程服务器_常见网络服务器并发模型
  7. android访问百度新闻,百度新闻(com.baidu.news) - 8.3.6.0 - 应用 - 酷安
  8. vc下动态改变鼠标光标
  9. python训练营 朋友圈点赞收费吗_微信朋友圈点赞,是不是扣话费?有人给
  10. Visual Studio启动、附加进程调试,多个Web Application时启动多个WebServer关闭方法
  11. svm多分类python代码_SVM算法的理解及其Python实现多分类和二分类
  12. 基于SEIR传染病模型的新冠肺炎疫情预测
  13. 各向异性渲染(一)基础理论
  14. python迭代对象是什么意思_python的迭代对象
  15. AWS KVS(Kinesis Video Streams)之WebRTC集成过程报错问题整理(八)
  16. 实例化对象是什么意思,什么是实例化,什么是对象。多态性
  17. 寄生感知共质心 FinFET 布局和布线以实现电流比匹配
  18. apk转换为html,我可以将.apk文件转换为html5吗?
  19. encodeURI,encodeURIComponent有什么区别?
  20. 人是需要信仰的,人只会把信仰寄托于不存在的东西-死人

热门文章

  1. 无知和冷漠其实比蓄意更严重
  2. [8] Replace the Numbers
  3. AutoMagic自动化测试平台简介
  4. flashplayer_10_ax_debug10.2.exe 安装错误。您尝试安装的adobeflasplayer不是最新版本
  5. ZigBee无线传感——CC2530单片机定时器1PWM输出
  6. 产品设计2.3五要素-③ 结构层
  7. 关于optimized out
  8. Smartbi报表设计:教你如何快速查询明细数据
  9. 神经网络卷积层以及池化层介绍
  10. 计算机网络基础网络协议——讲解(全面总结)