iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java多线程之同步锁-lock详解
  • 946
分享到

Java多线程之同步锁-lock详解

2024-04-02 19:04:59 946人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录一、题目描述二、解题思路三、代码详解一、题目描述 题目: 同步锁出现的目的就是为了解决多线程安全问题。 同步锁的几种方式 synchronized 1、同步代码块 2、同步方法

一、题目描述

题目:

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

同步锁的几种方式

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


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

--结束END--

本文标题: Java多线程之同步锁-lock详解

本文链接: https://www.lsjlt.com/news/168919.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java多线程之同步锁-lock详解
    目录一、题目描述二、解题思路三、代码详解一、题目描述 题目: 同步锁出现的目的就是为了解决多线程安全问题。 同步锁的几种方式 synchronized 1、同步代码块 2、同步方法 ...
    99+
    2022-11-13
  • Java线程同步Lock同步锁代码示例
    java线程同步原理java会为每个object对象分配一个monitor,当某个对象的同步方法(synchronizedmethods)被多个线程调用时,该对象的monitor将负责处理这些访问的并发独占要求。当一个线程调用一个对象的同步...
    99+
    2023-05-30
    java 线程同步 lock
  • Java多线程之死锁详解
    目录1、死锁2、死锁经典问题——哲学家就餐问题 总结1、死锁 出现场景:当线程A拥有了A对象的锁,想要去获取B对象的锁;线程B拥有了B对象的锁,想要拥有A对象的锁,两个线程...
    99+
    2022-11-12
  • Java多线程之synchronized同步代码块详解
    目录1. 同步方法和同步块,哪种更好?2. synchronized同步代码块3. 如果同步块内的线程抛出异常会发生什么?总结面试题: 1同步方法和同步块,哪种更好? 2.如果同步块...
    99+
    2022-11-13
  • Java多线程之线程同步
    volatile 先看个例子 class Test { // 定义一个全局变量 private boolean isRun = true; // 从主线程调...
    99+
    2022-11-12
  • C#多线程系列之多线程锁lock和Monitor
    目录1,Locklock 原型lock 编写实例2,Monitor怎么用呢解释一下示例设置获取锁的时效1,Lock lock 用于读一个引用类型进行加锁,同一时刻内只有一个线程能够访...
    99+
    2022-11-13
  • Java线程之线程同步synchronized和volatile详解
    上篇通过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么会产生这样的结果呢,因为建立的Count对象是线程共享的,一个线程改变了其成员变量num值...
    99+
    2023-05-30
    java 线程 synchronized
  • 多线程之死锁详解
    死锁是指两个或多个线程在执行过程中,因争夺资源而造成的一种互相等待的现象,如果无外力干涉,这些线程将无法继续执行下去。死锁的产生通常...
    99+
    2023-09-13
    多线程
  • Java详解多线程协作作业之信号同步
    目录一、信号同步二、基于时间维度1、CountDownLatch2、CyclicBarrier三、基于信号维度一、信号同步 多线程很多时候是协作作业。比如4个线程对电商数据分季度统计...
    99+
    2022-11-13
  • Python并行编程多线程锁机制Lock与RLock实现线程同步
    目录什么是锁机制?Lock() 管理线程RLock() 与Lock()的区别什么是锁机制? 要回答这个问题,我们需要知道为什么需要使用锁机制。前面我们谈到一个进程内的多个线程的某些资...
    99+
    2022-11-11
  • Java多线程同步器代码详解
    同步器为每种特定的同步问题提供了解决方案,同步器是一些使线程能够等待另一个线程的对象,允许它们协调动作。最常用的同步器是CountDownLatch和Semaphore,不常用的是Barrier 和ExchangerSemaphoreSem...
    99+
    2023-05-30
    java 多线程 同步器
  • Java线程的锁对象Lock同步问的处理方式
    本篇内容介绍了“Java线程的锁对象Lock同步问的处理方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Lock是java.util.co...
    99+
    2023-05-30
    java
  • Java并发编程之详解CyclicBarrier线程同步
    CyclicBarrier线程同步 java.util.concurrent.CyclicBarrier提供了一种多线程彼此等待的同步机制,可以把它理解成一个障碍,所有先到达这个障碍...
    99+
    2022-11-12
  • Java多线程中Lock锁如何使用
    这篇文章主要介绍“Java多线程中Lock锁如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java多线程中Lock锁如何使用”文章能帮助大家解决问题。Lock基本使用Lock它是java.u...
    99+
    2023-07-02
  • Java多线程同步工具类CountDownLatch详解
    目录简介核心方法CountDownLatch如何使用CountDownLatch运行流程运用场景总结简介 CountDownLatch是一个多线程同步工具类,在多线程环境中它允许多个...
    99+
    2022-11-13
  • Java 多线程的同步代码块详解
    目录synchronized同步代码块同步方法(this锁)静态同步方法死锁问题lock总结火车站抢票问题 由于现实中买票也不会是零延迟的,为了真实性加入了延迟机制,也就是线程休眠语...
    99+
    2022-11-12
  • Java学习之线程同步与线程间通信详解
    目录线程同步的概念同步代码块同步方法线程组线程组的相关方法线程组对象的基本应用线程间的通信线程通信简单应用线程同步的概念 由于同一个进程的多个线程共享同一块存储空间,在带来方便的同时...
    99+
    2022-12-27
    Java线程同步 Java线程通信 Java线程
  • C#多线程之线程同步
    一、前言 我们先来看下面一个例子: using System; using System.Threading; namespace ThreadSynchDemo { cl...
    99+
    2022-11-13
  • Java 多线程同步 锁机制与synchronized深入解析
    打个比方:一个object就像一个大房子,大门永远打开。房子里有很多房间(也就是方法)。这些房间有上锁的(synchronized方法), 和不上锁之分(普通方法)。房门口放着一把钥...
    99+
    2022-11-15
    Java 多线程同步 锁机制
  • Java多线程中Lock锁的使用小结
    Lock基本使用 Lock它是java.util.concurrent.locks下的一个接口,它也是用来处理线程同步问题的。 public interface Lock { ...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作