Java多线程同步锁-lock机制如何实现详细解析?

2026-05-25 21:491阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计775个文字,预计阅读时间需要4分钟。

Java多线程同步锁-lock机制如何实现详细解析?

目录

一、项目描述

二、解题思路

三、代码详解

一、项目描述

项目:同步锁出现的目的是为了解决多线程安全的问题。

二、解题思路

1.同步锁的几种方式:

1. synchronized代码块 2. 同步方法

三、代码详解

1.项目描述:

同步锁出现的目的是为了解决多线程安全的问题。

2. 题目: 同步锁出现的目的是为了解决多线程安全问题的目的。

3. 同步锁的几种方式: 1. synchronized代码块 2. 同步方法

目录
  • 一、题目描述
  • 二、解题思路
  • 三、代码详解

一、题目描述

题目:

同步锁出现的目的就是为了解决多线程安全问题。

同步锁的几种方式

synchronized

1、同步代码块

2、同步方法

jdk1.5后

3、lock锁:用lock()上锁,unlock()释放锁

实现:重现窗口售票多线程问题,并用lock锁解决。

二、解题思路

重现窗口售票多线程问题:

Java多线程同步锁-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同步锁内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

本文共计775个文字,预计阅读时间需要4分钟。

Java多线程同步锁-lock机制如何实现详细解析?

目录

一、项目描述

二、解题思路

三、代码详解

一、项目描述

项目:同步锁出现的目的是为了解决多线程安全的问题。

二、解题思路

1.同步锁的几种方式:

1. synchronized代码块 2. 同步方法

三、代码详解

1.项目描述:

同步锁出现的目的是为了解决多线程安全的问题。

2. 题目: 同步锁出现的目的是为了解决多线程安全问题的目的。

3. 同步锁的几种方式: 1. synchronized代码块 2. 同步方法

目录
  • 一、题目描述
  • 二、解题思路
  • 三、代码详解

一、题目描述

题目:

同步锁出现的目的就是为了解决多线程安全问题。

同步锁的几种方式

synchronized

1、同步代码块

2、同步方法

jdk1.5后

3、lock锁:用lock()上锁,unlock()释放锁

实现:重现窗口售票多线程问题,并用lock锁解决。

二、解题思路

重现窗口售票多线程问题:

Java多线程同步锁-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同步锁内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!