回顾多线程

news2024/11/14 21:49:42

1.线程有几种状态

 public enum State {
      //新生
        NEW,

       //运行
        RUNNABLE,

      //阻塞
        BLOCKED,

      //等待
        WAITING,

       //超时等待
        TIMED_WAITING,

      //终止
        TERMINATED;
    }

2.wait和sleep的区别

1.来自不同的类

wait=>Object类   

sleep => Thread类

2.关于锁的释放

wait 会释放锁,

sleep 睡觉了,抱着锁睡觉,不会释放!

3.使用的范围是不同的

wait  必须在同步代码块中使用

sleep 可以在任何地方睡

4.是否可以需要捕获异常   都是中断异常

wait 需要捕获异常

sleep 也需要抛出异常

3.Lock锁(重点)

1.传统Synchronized

package com.kuang.lock;
//基本的卖票例子

/**
 * 真正的多线程开发,公司中的开发,降低耦合性
 * 线程就是一个单独的资源类,他没有任何附属的操作!
 * 1.属性 、方法
 */
public class SaleTicketDemo01 {
       public static void main(String[] args) {
           //并发:多线程操作同一个资源类,把资源类丢入线程。
           Ticket ticket = new Ticket();
           //@FunctionalInterface 函数式接口 ,jdk1.8 Lambda表达式 (参数) -> {代码}
            new Thread(()->{
                for (int i = 0; i < 60; i++) {
                     ticket.sale();
                }
            },"A").start();
            new Thread(()->{
                for (int i = 0; i < 60; i++) {
                    ticket.sale();
                }
            },"B").start();
            new Thread(()->{
                for (int i = 0; i < 60; i++) {
                    ticket.sale();
                }
            },"C").start();




       }



}

// 资源类 OOP
class Ticket{
   // 属性、方法
    private int number=50;
    //卖票的方式
    public synchronized void sale(){
        if (number>0){
            System.out.println(Thread.currentThread().getName()+":卖出第"+(number--)+"张票,还剩"+number+"张票");
        }
    }


}

2.lock接口

new FairSync()公平锁

new NonfairSync()非公平锁

公平锁:十分公平,可以先来后到

非公平锁:十分不公平,可以插队(默认)

3秒 和 3小时的 如果公平锁 3秒中必须等3小时之后才能执行,

但是插队的话,就是谁抢到,谁执行,而且是有锁的。

package com.kuang.lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class SaleTicketDemo02 {
    public static void main(String[] args) {
        //并发:多线程操作同一个资源类,把资源类丢入线程。
        Ticket2 ticket = new Ticket2();
        new Thread(()->{for (int i = 0; i < 60; i++) ticket.sale();},"A").start();
        new Thread(()->{for (int i = 0; i < 60; i++) ticket.sale();},"B").start();
        new Thread(()->{for (int i = 0; i < 60; i++) ticket.sale();},"C").start();
    }
}

// 资源类 OOP
class Ticket2 {
    // 属性、方法
    private int number = 50;

    //卖票的方式
    //lock
    Lock lock =new ReentrantLock();


    public void sale() {

        lock.lock();//加锁

        try {
            //业务代码
            if (number > 0) {
                System.out.println(Thread.currentThread().getName() + ":卖出第" + (number--) + "张票,还剩" + number + "张票");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();//解锁
        }
    }
}

3.Synchronized 和 Lock 区别

  1. Synchronized 内置的Java关键字,Lock是个 Java接口类。
  2. Synchronized 无法判断获取所得状态,Lock 可以判断是否获取到了锁。
  3. Synchronized 会自动释放锁,Lock必须要手动释放锁!如果不释放锁,死锁!
  4. Synchronized 线程1(获得锁,阻塞),线程2(等待,傻傻的等);Lock锁就不一定会等待下去;
  5. Synchronized 可重入锁,不可以中断的,非公平;Lock锁,可重入锁,可以 判断锁,非公平(可以自己设置);
  6. Synchronized 适合锁少量的代码同步问题,Lock适合锁大量的同步代码!

提问?:锁是什么?如何判断锁的是谁!

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

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

相关文章

智能远程监考方案助力企业考试化繁为简

在音视频数字化之旅中&#xff0c;轻装上阵。 近年来&#xff0c;在数字化浪潮之下&#xff0c;远程考试频繁成为各领域热词&#xff0c;各企业也纷纷改革求新&#xff0c;将原本的企业内部考试转移到线上&#xff0c;从而获取更低廉的组考成本&#xff0c;更高的管理效率&…

程序和进程

一些基本概念&#xff1a; 进程的状态转换

Ardupilot — EKF3使用光流室内定位代码梳理

文章目录 前言 1 Copter.cpp 1.1 void IRAM_ATTR Copter::fast_loop() 1.2 void Copter::read_AHRS(void) 1.3 对象ahrs说明 2 AP_AHRS_NavEKF.cpp 2.1 void AP_AHRS_NavEKF::update(bool skip_ins_update) 2.2 void AP_AHRS_NavEKF::update_EKF3(void) 2.3 对象EKF3说…

LeetCode【27. 移除元素】

为国捐躯赴战场&#xff0c;丹心可并日争光。 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺…

[面试] 15道最典型的k8s面试题

文章目录 在 Kubernetes 中&#xff0c;有以下常见的资源对象&#xff1a;1.什么是 Kubernetes&#xff1f;它的主要特点是什么&#xff1f;2. Kubernetes 中的 Pod 是什么&#xff1f;它的作用是什么&#xff1f;3.Kubernetes 中的 Deployment 和 StatefulSet 有何区别&#x…

无涯教程-JavaScript - MATCH函数

描述 MATCH函数在单元格范围内搜索指定的项目,然后返回该项目在该范围内的相对位置。 当您需要某个项目在范围中的位置而不是项目本身时,请使用MATCH而不是LOOKUP函数之一。如。您可以使用MATCH函数为INDEX函数的row_num参数提供一个值。 语法 MATCH (lookup_value, lookup…

【送书活动】大模型赛道如何实现华丽的弯道超车

文章目录 导读前言AI/ML 模型训练任务对数据平台的需求01 具备对海量小文件的频繁数据访问的 I/O 效率02 提高 GPU 利用率&#xff0c;降低成本并提高投资回报率03 支持各种存储系统的原生接口04 支持单云、混合云和多云部署 核心密码01 通过数据抽象化统一数据孤岛02 通过分布…

Linux命令200例:apt-get软件包管理工具的使用

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0…

一文带你了解2023年最新央企名单、业务和管理机构(附资料)

前两天有个朋友留言问华研荟关于国企和央企的问题&#xff0c;他说经常在电视或网上看到国企、央企的表述&#xff0c;这两个的区别是什么&#xff1f;国企不都是国家所有吗&#xff1f;为什么还要有央企一说呢&#xff1f; 今天华研荟就来带大家了解一下两者的区别&#xff0…

RISC-V Reader 笔记(六)RV32V

RV32V 早期并行数据计算&#xff1a;采用 SIMD 单指令多数据&#xff0c;把一个64位宽寄存器拆成若干个32 16 8 位长度部分并行计算。这种方法前期看起来十分简单诱人。但是后来如果要扩展 SIMD 寄存器宽度&#xff0c;也要复杂化指令集&#xff0c;复杂开销越来越大。 向量操作…

【微服务】六. Nacos配置管理

6.1 Nacos实现配置管理 配置更改热更新 在nacos左侧新建配置管理 Data ID&#xff1a;就是配置文件名称 一般命名规则&#xff1a;服务名称-环境名称.yaml 配置内容填写&#xff1a;需要热更新需求的配置 配置文件的id&#xff1a;[服务名称]-[profile].[后缀名] 分组&#…

启用新的精细服务权限来更好地控制账单、成本管理和账户服务的访问权限

12 月 11 日&#xff0c;亚马逊云科技将在服务前缀 aws-portal 下停用账单、成本管理和账户控制台&#xff08;https://docs.amazonaws.cn/en_us/service-authorization/latest/reference/list_awsbillingconsole.html&#xff09;的 Amazon Identity and Access Management&am…

LeetCode-热题100-笔记-day29

199. 二叉树的右视图https://leetcode.cn/problems/binary-tree-right-side-view/ 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1…

音乐网站设计与实现

目 录 摘要 Abstract 1、引言 1.1 课题的目的和意义 1.2 国内现状分析 2、可行性研究与需求分析 2.1 可行性研究 2.1.1 经济可行性 2.1.2 技术可行性 2.1.3 运行可行性 2.1.4 时间可行性 2.1.5 法律可行性 2.2 需求分析 2.2.1 系统需求 2.2.2 …

如何让两台手机相互远程控制?

你的两台手机是什么系统的&#xff1f;如果你的两台手机都是安卓系统&#xff0c;而且都是安卓7.0及以上版本的系统&#xff0c;那么恭喜你&#xff0c;这两台手机可以相互远程控制&#xff01; 你可以利用两个软件实现将两台手机相互远程控制的想法。为了避免混淆&#xff0c…

中小企业建设数字化工厂,选择集成还是重构

随着科技的飞速发展和市场竞争的日益激烈&#xff0c;数字化工厂管理系统已成为中小企业未来发展的必经之路。然而&#xff0c;对于许多中小企业来说&#xff0c;建设数字化工厂并非易事。在建设数字化工厂的过程中&#xff0c;企业需要面对许多问题&#xff0c;其中最关键的问…

Git:Git的一些基本操作

文章目录 基本认识使用方法创建本地仓库配置本地仓库 工作区、暂存区、版本库的概念添加文件版本回退撤销修改删除操作 基本认识 首先要对Git有一个基本的认知&#xff1a; Git本质上是一个版本控制器&#xff0c;可以对一个信息的多个版本进行一些控制&#xff0c;而能对版本…

牛客: BM6 判断链表中是否有环

牛客: BM6 判断链表中是否有环 文章目录 牛客: BM6 判断链表中是否有环题目描述题解思路题解代码 题目描述 题解思路 一个慢指针,每次跳一次,一个快指针,每次跳两次,如果快指针遍历到链表终点,则链表无环,若慢指针和快指针相遇,则链表有环 题解代码 package main import . &…

MySQL基础运维知识点大全

一. MySQL基本知识 1. 目录的功能 通用 Unix/Linux 二进制包的 MySQL 安装下目录的相关功能 目录目录目录binMySQLd服务器&#xff0c;客户端和实用程序docs信息格式的 MySQL 手册manUnix 手册页include包括&#xff08;头&#xff09;文件lib图书馆share用于数据库安装的错…

第二章 进程与线程 四、进程通信

目录 一、共享存储 1、基于数据结构的共享 2、基于存储区的共享 二、消息传递 1、直接通信方式&#xff08;消息发送进程要指明接收进程的ID&#xff09; 2、间接通信方式&#xff08;通过“信箱”间接地通信。因此又称“信箱通信方式”&#xff09; 三、管道通信 注意&…