Lock接口介绍

news2024/11/21 0:25:42

1、 Synchronized

(1) 多线程编程模板上
1) 第一步:创建资源类。
2) 第二步:创建操作方法。
3) 第三步:创建线程调用操作方法。
4)原则:高内聚低耦合。

(2) 实现步骤
1)创建资源类。
2)资源类里创建同步方法、同步代码块。
3)创建线程调用操作方法。

(3) 举例:卖票程序

import java.util.ArrayList;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Ticket{
    private  int number=30;
    public synchronized void sale(){
        int i=0;
        synchronized (this){

        }

        if(number>0){
            System.out.println(Thread.currentThread().getName()
                    +"卖出"+(number--)+"号票\t还剩"+number);
        }

    }

}

public class SaleTicket {
    /**
     * 卖票程序复习线程知识:三个售票员  卖出    30张票
     * @param args
     * @throws Exception
     *1、线程 操作 资源类
     * 2、高内聚低耦合
     *
     */
    public static void main(String[] args) throws Exception {
        Ticket ticket = new Ticket();

        //Thread(Runnable target, String name)
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <=40 ; i++) {
                    ticket.sale();
                }
            }
        },"AA").start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <=40 ; i++) {
                    ticket.sale();
                }
            }
        },"BB").start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <=40 ; i++) {
                    ticket.sale();
                }
            }
        },"CC").start();

    }
}

2、 lock是什么?

比Synchronized更灵活的结构
在这里插入图片描述

Lock implementations provide more extensive locking operations than can be obtained using synchronized methods and statements. They allow more flexible structuring, may have quite different properties, and may support multiple associated Condition objects.
锁实现提供了比使用同步方法和语句可以获得的更广泛的锁操作。它们允许更灵活的结构,可能具有非常不同的属性,并且可能支持多个关联的条件对象。

3、 Lock接口的实现:ReentrantLock可重入锁

在这里插入图片描述

使用方法:

class X {
   private final ReentrantLock lock = new ReentrantLock();
   // ...
   public void m() {
     lock.lock();  // block until condition holds
     try {
       // ... method body
     } finally {
       lock.unlock()
     }
   }
 }

4、 创建线程方式

(1)继承Thread

public class SaleTicket extends Thread
java是单继承,资源宝贵,要用接口方式,所以不能使用继承Thread的方式。

(2)new Thread()

Thread t1 = new Thread();
t1.start();
此种方法,没有run方法执行,不能这样写。

(3)第三种

Thread(Runnable target, String name)
在这里插入图片描述
在这里插入图片描述

5、 实现runnable方法

(1)新建类实现runnable接口

class MyThread implements Runnable//新建类实现runnable接口
new Thread(new MyThread,...)

这种方法会新增类,有更新更好的方法。

(2)匿名内部类

new Thread(new Runnable() {
    @Override
    public void run() {
    }
   }, "your thread name").start(); 

这种方法不需要创建新的类,可以new接口。

(3)lambda表达式

new Thread(() -> {
 }, "your thread name").start();

这种方法代码更简洁精炼。

6、代码

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
class Ticket //实例例eld +method
{
 private int number=30;
/* //1同步 public synchronized void sale() 
 {//2同步  synchronized(this) {}
  if(number > 0) {
    System.out.println(Thread.currentThread().getName()+"卖出"+(number--)+"\t 还剩number);
   }
 }*/
 
// Lock implementations provide more extensive locking operations
// than can be obtained using synchronized methods and statements. 
 private Lock lock = new ReentrantLock();//List list = new ArrayList()
 
 public void sale() 
 {
   lock.lock();
   
   try {
    if(number > 0) {
     System.out.println(Thread.currentThread().getName()+"卖出"+(number--)+"\t 还剩number);
    }
   } catch (Exception e) {
    e.printStackTrace();
   } finally {
    lock.unlock();
   }
   
 }
 
}
 
 
/**
 * 
 * @Description:卖票程序个售票出  0张票
 @author xiale
 * 笔记:J里面如何 1 多线程编-上
    1.1 线程  (资里源类 *   1.2 高内聚 /
public class SaleTicket 
{
 public static void main(String[] args)//main所有程序
   Ticket ticket = new Ticket();
   //Thread(Runnable target, String name) Allocates a new Thread object.
   
 
   
 new Thread(() -> {for (int i = 1; i < 40; i++)ticket.sale();}, "AA").start();
 new Thread(() -> {for (int i = 1; i < 40; i++)ticket.sale();}, "BB").start();
 new Thread(() -> {for (int i = 1; i < 40; i++)ticket.sale();}, "CC").start();
 
   
   
   
/*  new Thread(new Runnable() {
    @Override
    public void run() 
    {
     for (int i = 1; i <=40; i++) 
     {
       
       ticket.sale();
     }
    }
   }, "AA").start();
   
   new Thread(new Runnable() {
    @Override
    public void run() 
    {
     for (int i = 1; i <=40; i++) 
     {
       ticket.sale();
     }
    }
   }, "BB").start();
   new Thread(new Runnable() {
    @Override
    public void run() 
    {
     for (int i = 1; i <=40; i++) 
     {
       ticket.sale();
     }
    }
   }, "CC").start();
   */
 }
}
 

//1 class MyThread implements Runnable
 
//2 匿名内部类
 
//3 laExpress
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/693840.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu下简单编译opencv

# 安装依赖&#xff0c;其中python-dev没有安装上没关系。 sudo apt install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libpng-dev libjpeg-dev libtiff5-dev libswscale-dev libjasper-dev libdc1394-22-dev libtiff-dev python-dev python-numpy libtb…

chatgpt赋能python:Python轨迹可视化:用数据讲故事

Python轨迹可视化&#xff1a;用数据讲故事 介绍 随着物联网、智能城市等领域的发展&#xff0c;越来越多的数据被收集下来并存储在数据库中。这些数据对于决策者来说是非常重要的&#xff0c;但是如何将这些数据进行展示和分析呢&#xff1f;这时候Python轨迹可视化就可以派…

java项目之后勤管理系统ssm源码+文档

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的后勤管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌&a…

【docker创建容器的坑】WSL启动nvidia-docker镜像:报错libnvidia-ml.so.1- file exists- unknown

可能得错误一&#xff1a; 今天使用docker创建容器的时候总是出错&#xff0c;最后锁定问题在“--gpus all”这里&#xff1a; 不加--gpu all可以运行&#xff0c;加入了--gpus all就出错&#xff1a; docker: Error response from daemon: failed to create task for conta…

C语言进阶(反码和补码)

文章目录 前言一、反码二、补码三、符号位四、在程序中打印反码和补码总结 前言 本篇文章我们主要来讲解C语言中的反码和补码&#xff0c;这个可能是大家比较容易忽略的点&#xff0c;那么这篇文章就带大家来学习一下什么是反码和补码。 一、反码 反码是通过对整数的二进制表…

基于FPGA的多通道数据采集单元同步的实现

多通道数据采集设备在当前信息数字化的时代应用广泛&#xff0c;各种被测量的信息 如光线、温度、压力、湿度、位置等&#xff0c;都需要经过多通道信号采集系统的采样和 处理&#xff0c;才能被我们进一步分析利用[37]。在一些对采集速率要求较高的军事、航天、 航空、工业制造…

【JUC进阶】06. 轻量级锁

目录 1、前言 2、轻量级锁 2.1、什么是轻量级锁 2.2、工作原理 2.2.1、回顾Mark Word 2.2.2、工作流程 2.3、解锁 3、适用场景 4、注意事项 5、轻量级锁与偏向锁的对比 6、小结 1、前言 前面一节我们讲到了偏向锁。当偏向锁被撤销&#xff0c;或其他线程竞争的时候…

国内脑机接口最新研究 - 脑控机器人在非结构化场景执行避障任务

&#x1f482; 个人主页: 同学来啦&#x1f91f; 版权: 本文由【同学来啦】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助&#xff0c;欢迎关注、点赞、收藏和订阅专栏哦 文章目录 &#x1f31f; 一、能避障的脑控机器人导航&#x1f31f; 二、机器…

Moveit1 机器人配置包超详细解析

前言 Moveit的robot_moveit_config包里有很多文件&#xff0c;在配置时容易搞不清关系&#xff0c;导致配置过程艰难、漫长。 同时互联网上的文档几乎没有详细介绍这部分配置包的&#xff0c;大神各有各的配法&#xff0c;比较混乱。 因此笔者整理了配置包内各个重要的文件&…

Volvo EDI 项目 MySQL 方案开源介绍

近期为了帮助广大用户更好地使用 EDI 系统&#xff0c;我们根据以往的项目实施经验&#xff0c;将成熟的 EDI 项目进行开源。用户安装好知行之桥 EDI 系统之后&#xff0c;只需要下载我们整理好的示例代码&#xff0c;并放置在知行之桥指定的工作区中&#xff0c;即可开始使用。…

Win10安装SQLite Expert Pers Setup64

在win10系统下安装SQLite Expert&#xff0c;我的电脑是64位系统&#xff0c;所以选择SQLite Expert Pers Setup64 一、软件下载 1、官网地址 SQLite administration | SQLite Expert 点击“DOWNLOAD”&#xff0c;选择红框中的免费版本 2、百度网盘下载 链接&#xff1a;h…

SQL SERVER2008导入导入mdf和ldf文件

把需要添加的文件复制粘贴到这个路径下&#xff1a; 再回到这点击添加&#xff1a;

商品减库在Redis中的运用

一.商品减库中存在问题 1.传统的代码 1.1引入jar包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.…

chatgpt赋能python:Python转换DAT的方法详解

Python转换DAT的方法详解 在数据处理的应用场景中&#xff0c;我们经常要将DAT文件格式转换为其他数据格式&#xff0c;比如CSV或Excel等。此时&#xff0c;Python的数据处理能力就表现出其强大的优势。在本文中&#xff0c;我们将详细介绍使用Python转换DAT文件格式的方法。 …

chatgpt赋能python:在Python中如何实现超链接本地文件

在Python中如何实现超链接本地文件 介绍 超链接是在网页中实现页面跳转的一种技术&#xff0c;而本地文件指的是计算机本地存储的文件。在Python中&#xff0c;我们可以通过一些库来实现超链接本地文件。 具体来说&#xff0c;需要使用到Python中的web框架以及文件操作库&am…

重温数据结构与算法之KMP算法

文章目录 前言一、原理1.1 暴力法1.2 最长公共前后缀 二、代码实现2.1 next数组2.2 可视化next2.3 KMP 三、总结3.1 优点3.2 缺点 参考 前言 ​ KMP 算法是一种字符串匹配算法&#xff0c;它可以在一个主串中查找一个模式串的出现位置。在实际应用中&#xff0c;字符串匹配是一…

LangChain 任意命令执行(CVE-2023-34541)

漏洞简介 LangChain是一个用于开发由语言模型驱动的应用程序的框架。 在LangChain受影响版本中&#xff0c;由于load_prompt函数加载提示文件时未对加载内容进行安全过滤&#xff0c;攻击者可通过构造包含恶意命令的提示文件&#xff0c;诱导用户加载该文件&#xff0c;即可造…

【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)

目录 一、双向链表二、node(int index) 根据索引找节点三、clear()四、add(int, E&#xff09;五、remove(int index)六、双向链表和单链表七、双向链表和动态数组八、jdk 官方的 LinkedList 的 clear() 方法 一、双向链表 &#x1f381; 单链表的节点中只有一个 next 指针引用…

1754_C语言assert函数功能初探

全部学习汇总&#xff1a; GreyZhang/c_basic: little bits of c. (github.com) 最近学习的过程中遇到了C语言中的assert函数&#xff0c;弄不明白这个函数到底是什么用。简单查了一下总结内容如下&#xff1a; 首先&#xff0c;此函数的声明头文件在assert.h中&#xff0c;使…

数据结构之哈夫曼树和哈夫曼编码

切入正题之前&#xff0c;我们先了解几个概念&#xff1a; 路径&#xff1a;从树的一个结点到另一个结点分支所构成的路线路径长度&#xff1a;路径上的分支数目树的路径长度&#xff1a;从根结点出发到每个结点的路径长度之和带权路径长度&#xff1a;该结点到根结点的路径长…