【JUC】一、synchronized关键字与Lock接口

news2024/12/26 11:24:35

文章目录

  • 1、JUC
  • 2、进程与线程
  • 3、并发与并行
  • 4、用户线程和守护线程
  • 5、对象锁和类锁
  • 6、Synchronized关键字
  • 7、synchronized案例
  • 8、Lock接口

1、JUC

JUC,即java.util.concurrent这个处理线程的工具包,始于JDK1.5,其中下有三个包,为:

  • 基础包
  • 原子包
  • 锁包

在这里插入图片描述

2、进程与线程

进程与线程的关系:

  • 进程是一个应用程序(一个进程是一个软件)
  • 线程是一个进程中的执行场景/执行单元。一个进程可以启动多个线程

把进程看作是现实生活中的公司,如京东。线程则可看作是其下的某一个职能部门,负责完成某任务,如开发部门。

举个例子:

DOS窗口运行java HelloWorld,先启动JVM,JVM是一个进程,JVM启动一个主线程调用main方法,同时再启动一个垃圾回收线程来负责看护、回收垃圾。(也就是说Java程序至少两线程并发,main方法对应的主线程+GC)

进程A和进程B的内存关系:

Java中,线程A和线程B,堆内存和方法区内存共享,但栈内存独立,一个线程一个栈。如启动了10个线程,就会有10个栈空间,每个栈和每个栈之间互不干扰,各自执行各自的,这就是多线程并发。

举个例子:

🍁Java中的多线程机制,目的就是为了提高程序的处理效率, 如火车站看成是一个进程,则每个售票小窗口就是一个个线程,甲在窗口1买票,乙在窗口2买票,谁也不用等谁 一个个售票窗口就像一个个栈,有自己独立的空间。售票大厅这个共用空间就像堆和方法区

3、并发与并行

先说下串行和并行:

  • 串行模式就是一次只能取一个任务,并执行这个任务,如必须先装完一车柴,才能运送这车柴,只有送到了,才能卸下这车柴。一个步骤完成了,才能进行下一个步骤。
  • 并行模式即可以同时取多个任务,并同时去执行所取得的这些任务

并行和并发,则是:

  • 并发:同一时刻,多个线程在访问同一个资源,多个线程对一个点,对应的例子: 春运抢票 电商秒杀

  • 并行:多项工作一起执行,之后再汇总例子,举例就是泡方便面,电水壶烧水,一边撕调料倒入桶中

4、用户线程和守护线程

Java中的线程分两类:

  • 用户自定义的线程,如主线程main线程、或者自定义的其他线程
  • 守护线程:如垃圾回收线程。一般守护线程是一个死循环,所有用户线程结束的时候,守护线程自动结束

写个测试代码:

public static void main(String[] args){

	Thread aa = new Thread( () -> {
		
		System.out.println(Thread.currentThread().getName() + "::" + Thread.currentThread().isDaemon());
		while (true) {
		
		}
	}, "aa");
	aa.setDaemon(true);
	aa.start();
	System.out.println(Thread.currentThread().getName() + " over");
}

可以看到,aa.setDaemon(true)被注释时,aa线程属于用户自定义线程,此时main线程结束以后,自定义的aa线程不受影响,JVM继续存活:

在这里插入图片描述

aa线程被set为守护线程后,则当用户线程都结束时,守护线程自动结束:

在这里插入图片描述

5、对象锁和类锁

锁是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问。一次只能有一个线程获得锁,对共享资源的所有访问都需要首先获得锁。不过,某些锁可能允许对共享资源并发访问,如ReadwriteLock的读取锁。

  • 类锁属于一个类,类似静态变量,多个实例对象对应同一个锁,一个类一把锁
  • 对象锁属于对象实例,类似类属性变量,每一个实例对象,就对应一个锁,100个类A的对象,就有一百个对象锁

6、Synchronized关键字

synchronized是Java关键字,表示一种同步锁,这个关键字:

  • 可修饰代码块,作用范围是大括号中的语句,作用对象是调用这个代码块的对象
synchronized(线程共享对象){//线程同步代码块,即要排队执行的代码块}
  • 可修饰方法,作用范围是整个方法,作用对象是调用这个方法的对象
public synchronized void doSome(){
	//...
}
  • 在实例方法中使用synchronized,表示共享的对象一定是this,并且同步的代码块是整个方法体
  • 在静态方法中使用synchronized,表示找类锁,类锁永远只有1把(对象锁是100个对象就有100个对象锁)

7、synchronized案例

多线程编程的步骤

  • 步骤一:创建(将来被共享的)资源类,创建属性和操作方法
  • 步骤二:在资源类的操作方法中进行:判断、干活儿、通知
  • 步骤三:创建多线程调用资源类的方法
  • 步骤四:防止虚假唤醒现象

模拟三个售票员同时对外出售30张票,三个售票员,即三个线程,资源类就是票类,资源类的属性是票的数量:

//资源类
class Ticket{

    private Integer number = 30;

    public synchronized void sale(){
        if(number > 0 ){
            System.out.println(Thread.currentThread().getName() + ": 卖出票,剩余" + number--);
        }
    }
}

开三个线程,调用资源类中的方法:

public class SaleTicket {

    public static void main(String[] args) {
    	//多个线程共用这个资源对象
        Ticket ticket = new Ticket();
        new Thread(() -> {
            for(int i = 0 ; i < 40; i++ ){
                ticket.sale();
            }
        },"AA").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0 ; i < 40; i++ ){
                    ticket.sale();
                }
            }
        },"BB").start();
        Thread cc = new Thread(() -> {
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        }, "CC");
        cc.setPriority(Thread.MAX_PRIORITY);
        cc.start();
    }


}


在这里插入图片描述

8、Lock接口

API文档:

https://tool.oschina.net/apidocs/apidoc?api=jdk-zh

Lock接口比synchronized更灵活,其实现类有:

  • ReentrantLock
  • ReentrantReadWriteLock.ReadLock
  • ReentrantReadWriteLock.WriteLock

ReentrantLock即可重入锁,类比排队上厕所,进门后锁门,用完后解锁,下个人继续上锁,用完解锁。

class X {
   private final ReentrantLock lock = new ReentrantLock();
   // ...

   public void m() { 
     lock.lock();  // block until condition holds
     try {
       // ... method body
     } finally {
       lock.unlock()
     }
   }
 }

Lock接口比synchronized的对比:

  • Lock是一个接口,有对应的实现类,而synchronized是Java关键字
  • synchronized不需要用户去手动释放锁,synchronized代码块或者方法执行结束或者发生异常时,系统会自动让线程释放锁,而Lock需要开发者手动释放锁
  • Lock可以让等待锁的线程响应终端,而synchronized不行,等待的线程会一直等待下去
  • Lock可以直到有没有成功获取锁,而synchronized不行
  • Lock可以提到多个线程进行读操作的效率
  • 大量线程同时竞争激烈时,Lock性能远胜synchronized

用Lock实现上篇synchronized实现的卖票例子:

//资源类
class LTicket{

    private Integer number = 30;

    private final ReentrantLock lock = new ReentrantLock();

    public void sale(){
        //上锁
        lock.lock();
        try {
            if( number > 0 ){
                System.out.println(Thread.currentThread().getName() + ": 卖出票,剩余" + number--);
            }

        } finally {
            //释放锁写finally语句中,防止上面发生异常导致锁未释放
            lock.unlock();
        }
    }
}

创建共享资源类对象,开多个线程调用资源类的方法:

public class LSaleTicket {

    public static void main(String[] args) {
        LTicket ticket = new LTicket();
        new Thread(() -> {
            for(int i = 0 ; i < 40; i++ ){
                ticket.sale();
            }
        },"AA").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0 ; i < 40; i++ ){
                    ticket.sale();
                }
            }
        },"BB").start();
        new Thread(() -> {
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        }, "CC").start();
    }
}

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

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

相关文章

华为的干部管理和人才管理实践精髓(深度好文,收藏)

&#xff08;本文摘自谢宁专著《华为战略管理法&#xff1a;DSTE实战体系》&#xff0c;欢迎购买&#xff09; 1997年&#xff0c;在《华为基本法》的起草过程中&#xff0c;起草小组的一位人大教授问任正非:“任总&#xff0c;人才是不是华为的核心竞争力?”任正非的回答出人…

阿里三面被虐惨,非让我举例说明,为什么GC需要Stop the World?

最近&#xff0c;五哥回忆起4年前在蚂蚁金服三面的经历。关于GC的一个问题&#xff0c;让我记忆深刻。 当聊起来Java GC时&#xff0c;我提到 young gc 和 full gc都会 Stop the world。 ”为什么需要 Stop the world“&#xff0c;蚂蚁面试官问道。 我略微怔住&#xff0c;…

WH4530A可检测0-100cm环境光+距离检测功能

台湾旺泓推出的WH4530A是一款结合了先进环境光传感器&#xff08;ALS&#xff09;先进接近传感器&#xff08;PS&#xff09;和高效率的红外LED灯三合一为一体的光距感接近传感器&#xff1b;可测距范围0-100cm;采用I2C接口&#xff0c;可实现超高灵敏度、精准测距检测范围广等…

设备管理软件有什么用?如何让维修工作智能化?

随着数字化和人工智能技术的不断发展&#xff0c;设备管理软件已经成为了一种智能化的管理方式&#xff0c;它能够整合设备设施的维修资源&#xff0c;实现全生命周期的设备设施管理。这种软件可以帮助机构单位更好地跟踪和管理设备设施的维修请求&#xff0c;提高维修效率和管…

OA+CRM+HR+ERP 客户关系 进销存 财务 办公审批系统源码

功能介绍 1、个人中心 电话薄&#xff1a;主要用于添加联系人信息&#xff0c;相当于通讯录功能&#xff0c;可以存贮相关联系人的基本信息&#xff0c;姓名、联系方式、地址、邮箱等。 工作日志 &#xff1a;主要用于记录个人工作生活中大小事情的备忘&#xff0c;相当于备…

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-超级终端

红队专题 招募六边形战士队员[16]超级终端(1) 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 [16]超级终端(1) 服务端 — 本地打开cmd — 接收命令 — 执行 — 发送回显 客户端 — 远端发送命令 — 接收回显 发送开启cmd命令 --- 接受…

Rectangle:掌控你的Mac视窗,提升工作效率

你是否曾经在Mac上同时处理多个窗口&#xff0c;却因为无法有效管理而感到困扰&#xff1f;现在&#xff0c;一款全新的窗口管理工具正在改变这一切&#xff0c;它就是Rectangle。 Rectangle是一款简单而强大的窗口管理工具&#xff0c;适用于Mac系统。它改变了传统的窗口管理…

深度学习AI识别人脸年龄

以下链接来自 落痕的寒假 GitHub - luohenyueji/OpenCV-Practical-Exercise: OpenCV practical exercise GitHub - luohenyueji/OpenCV-Practical-Exercise: OpenCV practical exercise import cv2 as cv import time import argparsedef getFaceBox(net, frame, conf_thresh…

拆解软件定义汽车:OS突围

软件作为智能汽车的核心组成部分&#xff0c;由于自身较为独立和复杂的IT学科体系&#xff0c;其技术链路、产业分工、价值分配、商业模式相对硬件产品&#xff08;如域控、激光雷达、摄像头等硬件&#xff09;而言&#xff0c;在汽车产业内探讨和传播相对较少。 11月3日&…

GoLong的学习之路,进阶,语法之并发(并发错误处理)补充并发三部曲

这篇文章主要讲的是如何去处理并发的错误。 在Go语言中十分便捷地开启goroutine去并发地执行任务&#xff0c;但是如何有效的处理并发过程中的错误则是一个很棘手的问题。 文章目录 recovererrgroup recover 哦对&#xff0c;似乎没写错误处理的文章。后面补上。 首先&…

Mac 本地部署thinkphp8【配置环境】

PHP开发工具 我这里选择的是VSCode,里面安装PHP插件 把thinkphp的项目放到 切换到phpenv ![在这里插入图片描述](https://img-blog.csdnimg.cn/a15cc442fab74754ad86d74f6d9942e5.png URL重写如果不改&#xff0c;在请求的时候地址是这样的‘http://tp.com/index.php…

数据可视化模板案例:制造业提高生产力的关键

一、模板背景 在这个信息爆炸的时代&#xff0c;数据对于企业的成功至关重要。制造业作为全球经济的重要组成部分&#xff0c;如何有效利用数据提高生产效率、降低成本、优化决策&#xff0c;已成为行业关注的焦点。 二、方案思路 配⾊ - 科技蓝&#xff0c;贴合⼯业主题。 …

【算法与数据结构】78、90、LeetCode子集I, II

文章目录 一、题目二、78.子集三、90.子集II三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、78.子集 思路分析&#xff1a;【算法与数据结构】77、LeetCode组合。本题可以参考77题的组合问题代码&#xff0…

/etc/init.d/functions: Syntax error: “(“ unexpected (expecting “done“)

一.问题描述&#xff1a; ubuntu系统安装服务时报错&#xff1a; 二.问题解析&#xff1a; Ubuntu安装时默认使用dash&#xff0c;shell脚本命令失败&#xff0c;需要安装bash来运行&#xff0c;长期解决该问题就是重新配置dash 三:问题解决&#xff1a; sudo dpkg-reconfi…

迅为龙芯2K1000开发板虚拟机ubuntu启动root用户

作为嵌入式开发人员&#xff0c;系统的所有权限都要为我们打开&#xff0c;所以我们不必像运维那样&#xff0c;对 root 用户非常敏感&#xff0c;所以安装完 ubuntu 系统以后&#xff0c;我们要启用 root 用户。 首先我们打开 ubuntu 控制终端&#xff0c;然后在终端里面输入…

wireshark抓包并进行Eigrp网络协议分析

路由协议 Eigrp ​ EIGRP:Enhanced Interior Gateway Routing Protocol 即 增强内部网关路由协议。也翻译为 加强型内部网关路由协议。 EIGRP是Cisco公司的私有协议&#xff08;2013年已经公有化&#xff09;。 EIGRP结合了链路状态和距离矢量型路由选择协议的Cisco专用协议&a…

银行数据中心机房动力环境监控系统设计与优化

安科瑞电气股份有限公司 上海嘉定201801 摘要&#xff1a;结合银行数据中心建设项目&#xff0c;设计银行数据中心机房动力环境监控系统&#xff0c;分析银行数据中心机房监控对象、搭建系统监控架构&#xff0c;给出监控实现方法&#xff0c;*后针对运行一段时间出现的问题&a…

关于淘宝API接口你必须了解的API2.0

据说API从1.0升级到2.0啦&#xff1f;今天我们来聊一聊关于淘宝API接口你必须了解的API2.0 然而 作为新手小白 …… 并不懂API是毛线 好吧 …… 今天 我们就来上一堂小白入门课 几句话聊聊API 高级淘客 请忽略 请批评 请交流 还有请看到最底下 有重磅消息&#xf…

人大女王金融硕士毕业生:追风而遇、沐光同行;心羽为翼,不负韶华!

中国人民大学-加拿大女王大学金融硕士2022-2023级行业高管班 新加坡大东方人寿北京代表处首席代表 01、社会发展推动金融业持续迭代&#xff0c;为更好应对未来挑战&#xff0c;持续学习和自我升级非常重要&#xff01; 2015年以来&#xff0c;新一代数字化和智能化信息技术…

halcon获取轮廓属性的时候报错:Contour attribute not defined(HALCON错误代码:3261)

报错截图&#xff1a; 在使用以下算子&#xff0c;获取xld的distance属性时&#xff0c;或者其他属性时报错。 get_contour_attrib_xld (ObjectSelected, distance, Attrib) 如果是属性报错。这里需要在调用获取轮廓属性之前先获得轮廓之间的距离。 使用以下算子&#xff1a;…