Lock锁确保线程安全

  • 在同一个JVM下,如何确保线程安全?
  • 什么是锁?
  • ReentrantLock保证线程安全
  • ReentrantReadWriteLock保证线程安全

在同一个JVM下,如何确保线程安全?

在我们所熟悉的前提下,主要通过以下俩种手段确保线程的安全性。
1、synchronized关键词
2、锁

什么是锁?

通俗的讲,就是每家每户出门的时候都是需要锁门的,避免小偷光顾!在我们Java里上锁的方式有ReentrantLock、ReentrantReadWriteLock俩种实现方式。此处我理解的加锁处理数据的方式是:串行。

ReentrantLock保证线程安全

需求:
我们现在总共有10张通往大理的飞机票,并且有三个售票窗口进行售票,该如何设计购票程序,使其不会有少售,多售的情况出现?

定义三个售票窗口如下:

 MyRunable myRunable = new MyRunable();Thread thread = new Thread(myRunable, "窗口一");Thread thread1 = new Thread(myRunable, "窗口二");Thread thread2 = new Thread(myRunable, "窗口三");thread.start();thread1.start();thread2.start();

定义具体售票操作如下:

public class MyRunable implements  Runnable {private int tickets = 10; // 定义十张票private final Lock lock =  new ReentrantLock();@Overridepublic void run() {while (true){lock.lock();if (tickets > 0){try {Thread.sleep(1000);System.out.println(Thread.currentThread().getName() +" 出售了第 " + tickets-- + " 张票");}catch (Exception e){e.printStackTrace();}finally {lock.unlock();}}else{lock.unlock();}}}
}

在我们加锁的前提下,切记需要在final中去释放锁,不然会造成死锁状态!

购票期望结果:

ReentrantReadWriteLock保证线程安全

需求:
我们现在总共有10张通往大理的飞机票,并且有三个售票窗口进行售票,该如何设计购票程序,使其不会有少售,多售的情况出现?

定义三个售票窗口如下:

 MyRunableReadWrite myRunable = new MyRunableReadWrite();Thread thread = new Thread(myRunable, "窗口一");Thread thread1 = new Thread(myRunable, "窗口二");Thread thread2 = new Thread(myRunable, "窗口三");thread.start();thread1.start();thread2.start();

定义具体售票操作如下:

public class MyRunableReadWrite implements  Runnable {private int tickets = 10; // 定义十张票private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();@Overridepublic void run() {while (true){readWriteLock.readLock().lock();if (tickets > 0){try {readWriteLock.readLock().unlock();readWriteLock.writeLock().lock();Thread.sleep(1000);System.out.println(Thread.currentThread().getName() +" 出售了第 " + tickets-- + " 张票");}catch (Exception e){e.printStackTrace();}finally {readWriteLock.writeLock().unlock();}}else {readWriteLock.readLock().unlock();}}}
}

读写锁,在我们日常开发中也是及其重要的一个锁,具体理解如下:我们程序首先给读锁加锁,读到数据进行读锁解锁操作,并给写锁加锁,等数据写完之后给写锁进行解锁操作。必须进行解锁操作,否则会造成死锁。

购票期望结果:

Lock锁确保线程安全相关推荐

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

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

  2. (删)Java线程同步实现二:Lock锁和Condition

    在上篇文章(3.Java多线程总结系列:Java的线程同步实现)中,我们介绍了用synchronized关键字实现线程同步.但在Java中还有一种方式可以实现线程同步,那就是Lock锁. 一.同步锁 ...

  3. Python3进阶--Socket编程、多线程(创建方式、线程通信、线程锁、线程池)

    第一章 变量.常用循环体.代码结构.代码练习 第二章 列表.元组等数据结构.字符串驻留机制及字符串格式化操作 第三章 函数.面向对象.文件操作.深浅拷贝.模块.异常及捕获 第四章 项目打包.类和对象高 ...

  4. Java 多线程和并发编程:(二)线程同步 Lock 锁

    线程同步 Lock 锁 1.Lock 锁 2.步骤 3.Lock 与 synchronized 的区别 1.Lock 锁 Lock 锁:对需要上锁的地方上锁 JDK1.5 后新增的功能 与 Synch ...

  5. 【解决线程安全问题:通过Lock锁对象】

    [解决线程安全问题:通过Lock锁对象] 参考文章: (1)[解决线程安全问题:通过Lock锁对象] (2)https://www.cnblogs.com/zuixinxian/p/9570409.h ...

  6. 线程高级篇-Lock锁和Condition条件

    浅谈Synchronized: synchronized是Java的一个关键字,也就是Java语言内置的特性,如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,执行代码块时,其 ...

  7. 多线程和线程安全 同步代码 lock锁

     多线程:Thread Runnable 并发与并行 •并发:指两个或多个事件在同一个时间段内发生. •并行:指两个或多个事件在同一时刻发生(同时发生). 线程 是程序中的执行线程.Java 虚拟机允 ...

  8. 线程安全(二)Lock 什么是Lock线程锁?与synchronized区别在哪?Lock锁是如何实现等待通知的?如何实现线程顺序执行?

    文章目录 前言 一.synchronized的缺陷 二.Lock接口的特性及基本方法 接口的特性 接口基本的方法: 三.ReentrantLock介绍及实例 ReentrantLock类常见方法: l ...

  9. 多线程的三种实现方法、线程类的常见方法、线程安全问题:synchronized和Lock锁、生产者和消费者问题

    1. 多线程的三种实现方式 1.1 继承Thread类 实现步骤: 定义一个类MyThread继承Thread类 在MyThread类中重写run()方法 创建MyThread类的对象 启动线程sta ...

  10. 23.多线程(进程的概述和多进程的意义,线程的概述和多线程的意义,JVM运行原理以及JVM启动的线程探讨,实现多线程 线程调度,线程控制,Lock锁,死锁现象)

    1.进程概述及多进程的意义 1.线程和进程     要想说线程,首先必须得聊聊进程,因为线程是依赖于进程存在的. 2.进程概述     什么是进程呢?通过任务管理器我们就可以看到进程的存在.      ...

最新文章

  1. 2022-2028年中国操作系统行业深度调研及投资前景预测报告
  2. c语言p gt name,c语言中strcmp(p-name,s)是什么意思?
  3. 各样本观察值均加同一常数_对色师傅分享:如何使不同观察者在灯箱下观察的色光一致?...
  4. 抖音数据统计_“彭十六elf”单条视频获赞200W+,荣登抖音TOP20丨红人榜
  5. [云炬小程序实战笔记] 第1章 全新版:初识微信小程序
  6. 近乎于“妖”!浅谈《山海镜花》的美术风格与设计
  7. mobomarket android,MoboMarket
  8. 抓包工具之fiddler
  9. 帝云CMS内容管理系统
  10. 阿里云短信接口配置教程
  11. 20210605:前期使用pyqt5做的操作流程界面化,涉及mysql代码写的太差,可以用函数复用减少代码
  12. Windows NT引导过程源代码分析(一)
  13. Exploring the Emerging Type of Comment for Online Videos: DanMu
  14. 结构化数据和非结构化数据的提取【Python篇】
  15. 小米 微信:无法连接服务器,微信出现大规模故障 多地无法登录
  16. Matlab中实现圆形矩阵,圆外为0
  17. toad for oracle如何执行sql文件,toad执行sql语句
  18. SQL简明数据分析教程
  19. 摄影中的曝光补偿、白加黑减_我是亲民_新浪博客
  20. 用Python做了个不良图片识别系统(附源码)

热门文章

  1. 如何利用抖加实现精准引流?3种玩法,愿你别再花冤枉钱了?(五)
  2. MAC配置IOS、Android真机以及appium环境配置,最新版(一)
  3. 通过网页获取图片操作步骤
  4. Excel里怎么冻结某一行某一列
  5. 查看git brach_Excel Go Brach – Excelebrations
  6. Word怎么在空白处添加下划线
  7. Meta-Tracker: Fast and Robust Online Adaptation for Visual Object Trackers
  8. python算p值,python实现计算两组数据P值的方法
  9. phpstudy配置sg11
  10. 汉字识别原理、方法与实现