目录 一、题目描述 二、解题思路 三、代码详解 一、题目描述 题目: 同步锁出现的目的就是为了解决多线程安全问题。 同步锁的几种方式 synchronized 1、同步代码块 2、同步方法 jdk1.
目录
- 一、题目描述
- 二、解题思路
- 三、代码详解
一、题目描述
题目:
同步锁出现的目的就是为了解决多线程安全问题。
同步锁的几种方式
synchronized
1、同步代码块
2、同步方法
jdk1.5后
3、lock锁:用lock()上锁,unlock()释放锁
实现:重现窗口售票多线程问题,并用lock锁解决。
二、解题思路
重现窗口售票多线程问题:
新创建类:LockDemo1
在main方法中,新创建三个线程,一起启动这三个线程。
新创建内部类:Ticket , Ticket implements Runnable
Ticket中每0.2秒卖一张票,用--i
使用lock锁:
新创建类:LockDemo2
在main方法中,新创建三个线程,一起启动这三个线程。
新创建内部类:Ticket , Ticket implements Runnable
在这段逻辑之前上锁,逻辑结束后释放锁 要把释放锁放在finally里
Ticket中每0.2秒卖一张票,用--i
lock锁相比于synchronized的好处是 灵活 ,可由研发人员自行控制加锁和解锁的时机。
三、代码详解
LockDemo1
/** * Description: 重现窗口售票多线程问题 * * @author xiaoxuzhu * @version 1.0 * * <pre> * 修改记录: * 修改后版本 修改人 修改日期 修改内容 * 2022/5/15.1 xiaoxuzhu 2022/5/15 Create * </pre> * @date 2022/5/15 */ public class LockDemo1 { public static void main(String[] args) { Ticket ticket = new Ticket(); new Thread(ticket, "1号窗口").start(); new Thread(ticket, "2号窗口").start(); new Thread(ticket, "3号窗口").start(); } static class Ticket implements Runnable { private int tick = 100; @Override public void run() { while (true) { try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } if (tick > 0) { System.out.println(Thread.currentThread().getName() + "完成售票,余票是:" + --tick); } } } } }
出现多线程问题:
LockDemo2
public class LockDemo2 { public static void main(String[] args) { Ticket ticket = new Ticket(); new Thread(ticket, "1号窗口").start(); new Thread(ticket, "2号窗口").start(); new Thread(ticket, "3号窗口").start(); } static class Ticket implements Runnable { private int tick = 100; //创建锁 private Lock lock = new ReentrantLock(); @Override public void run() { while (true) { //上锁 lock.lock(); try { try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } if (tick > 0) { System.out.println(Thread.currentThread().getName() + "完成售票,余票是:" + --tick); } }finally { lock.unlock(); } } } } }
到此这篇关于Java多线程之同步锁-lock详解的文章就介绍到这了,更多相关Java同步锁内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!