山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(十七)- JUC(3)

目录

synchronized

面向对象改进

synchronized加在方法上

线程八锁


synchronized

线程1上锁之后,线程2无法获取锁不能够执行临时区,线程2阻塞等待线程1完成释放锁之后才能够使用。可以把synchronize类比成一个房间,每次有锁的人才能够进入房间做事情,就算cpu时间片用完,只要没有这个锁那么其他线程是无法进入房间的。当用完之后就会释放锁,并且唤醒那些阻塞的线程

解决

  @Slf4jpublic class Test {​static int counter = 0 ;​// 定义锁对象static Object lock = new Object();​public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() ->{for (int i = 0; i < 5000; i++) {synchronized (lock){       // 上锁counter ++ ;}}});​Thread t2= new Thread(() ->{for (int i = 0; i < 5000; i++) {synchronized (lock){counter -- ;}}});​​t1.start();t2.start();t1.join();t2.join();System.out.println(counter);​}​}

synchonized实际上是使用对象锁保证了临界区内代码的原子性,临界区是不可分割的,不会被线程切换打断

面向对象改进

  @Slf4jpublic class Test {public static void main(String[] args) throws InterruptedException {Room room = new Room();​Thread t1 = new Thread(() ->{for (int i = 0; i < 5000; i++) {room.increment();}});​Thread t2= new Thread(() ->{for (int i = 0; i < 5000; i++) {room.decrement();}});​​t1.start();t2.start();t1.join();t2.join();System.out.println(room.getCounter());​}​}​​class Room{int count = 0 ;​public void increment(){synchronized (this){count ++ ;}}​public void decrement(){synchronized (this){count --;}}​public int getCounter(){synchronized (this){return count;}}}

synchronized加在方法上

  class c1{public synchronized void test(){} }​class c1{public void test(){synchronized (this){​}}}​二者等价,锁住的是this对象

加载静态方法上相当于锁住类对象

线程八锁

情况1 : 1 2或者2 1

  ​@Slf4jpublic class Test {public static void main(String[] args) throws InterruptedException {Number n1 = new Number();new Thread(() -> {log.debug("begin");n1.a();}).start();new Thread(() -> {log.debug("begin");n1.b();}).start();}​}​​@Slf4jclass Number{public synchronized void a(){log.debug("1");}​public synchronized void b(){log.debug("2");}​}

情况2 : 1s后1 2 或 1s后2 1

  ​@Slf4jpublic class Test {public static void main(String[] args) throws InterruptedException {Number n1 = new Number();new Thread(() -> {log.debug("begin");n1.a();}).start();new Thread(() -> {log.debug("begin");n1.b();}).start();​}​}​@Slf4jclass Number{public synchronized void a() throws InterruptedException {Thread.sleep(1000);log.debug("1");}​public synchronized void b(){log.debug("2");}​​}

情况3 : 3 ,1s后 1 2 || 3 , 2 1s后打印1 || 2 , 3 1s后打印1

  @Slf4jpublic class Test {public static void main(String[] args) throws InterruptedException {Number n1 = new Number();new Thread(() -> {log.debug("begin");n1.a();}).start();new Thread(() -> {log.debug("begin");n1.b();}).start();​new Thread(() -> {log.debug("begin");n1.c();}).start();​}​}​@Slf4jclass Number{public synchronized void a()  {try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}log.debug("1");}​public synchronized void b(){log.debug("2");}​public  void c(){log.debug("3");}​​}

情况4 : 先2,1s后打印1

  @Slf4jpublic class Test {public static void main(String[] args) throws InterruptedException {Number n1 = new Number();Number n2 = new Number();new Thread(() -> {log.debug("begin");n1.a();}).start();​new Thread(() -> {log.debug("begin");n2.b();}).start();​​​}​}@Slf4jclass Number{public synchronized void a()  {try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}log.debug("1");}​public synchronized void b(){log.debug("2");}​​}

情况5 : 先2,1s后打印1

  @Slf4jpublic class Test {public static void main(String[] args) throws InterruptedException {Number n1 = new Number();new Thread(() -> {log.debug("begin");n1.a();}).start();​new Thread(() -> {log.debug("begin");n1.b();}).start();}​}​@Slf4jclass Number{public static synchronized void a()  {     // 锁住的是类对象try { Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}log.debug("1");}​public synchronized void b(){log.debug("2");}​​}​​

情况6 : 1s后打印1 后2 || 2 1s后打印1

  @Slf4jpublic class Test {public static void main(String[] args) throws InterruptedException {Number n1 = new Number();new Thread(() -> {log.debug("begin");n1.a();}).start();​new Thread(() -> {log.debug("begin");n1.b();}).start();​}​}​@Slf4jclass Number{public static synchronized void a()  {try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}log.debug("1");}​public static synchronized void b(){log.debug("2");}​}

情况7 : 先2 1s后打印1

  import lombok.extern.slf4j.Slf4j;​​@Slf4jpublic class Test {public static void main(String[] args) throws InterruptedException {Number n1 = new Number();Number n2 = new Number();new Thread(() -> {log.debug("begin");n1.a();}).start();​new Thread(() -> {log.debug("begin");n2.b();}).start();​​​}​}​​@Slf4jclass Number{public static synchronized void a()  {try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}log.debug("1");}​public  synchronized void b(){log.debug("2");}​​}​​

情况8 : 1s后打印1 后2 || 2 1s后打印1

  import lombok.extern.slf4j.Slf4j;​​@Slf4jpublic class Test {public static void main(String[] args) throws InterruptedException {Number n1 = new Number();Number n2 = new Number();new Thread(() -> {log.debug("begin");n1.a();}).start();​new Thread(() -> {log.debug("begin");n2.b();}).start();​}​}​@Slf4jclass Number{public static synchronized void a()  {try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}log.debug("1");}​public static synchronized void b(){log.debug("2");}​}

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

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

相关文章

Linux基础 (十一):进程间通信

Linux进程间通信&#xff08;Inter-Process Communication, IPC&#xff09;是指在不同进程之间交换数据或信息的机制。由于进程间不能直接共享内存&#xff0c;Linux 提供了多种 IPC 机制来实现进程间的通信。主要为&#xff1a;管道、信号量、共享内存、消息队列、套接字。 目…

C++三方库编译之GCC11.3.0

本系列准备持续更新&#xff0c;目的是将网上开源的三方库的编译过程与步骤&#xff0c;无脑展示&#xff0c;内容纯执行脚本与代码&#xff0c;不讲原理&#xff0c;也不科普库。 三方库编译很简单的(三板斧&#xff1a;configuremakeinstall)&#xff0c;为啥还需要整理&…

[Cesium学习]

底图切换 Cesium之底图切换_cesium地图切换-CSDN博客 ImageryProvider Cesium中比例尺设置 cesium给地图添加比例尺学习踩坑记录_cesium 比例尺-CSDN博客 webpack与less-loader版本对应问题 报错this.getOptions is not a function at Object.lessLoader”指的是在使用we…

halcon 传统缺陷检测

一、电路检测 算子解释 dyn_threshold *dyn_threshold 利用局部阈值分割图像*OrigImage (input_object)&#xff1a;原始图像*ThresholdImage (input_object)&#xff1a;处理后图像&#xff08;一般采用滤波处理&#xff09;*RegionDynThresh (output_object)&#xff1…

操作系统 - 文件管理

文件管理 考纲内容 文件 文件的基本概念&#xff1b;文件元数据和索引节点(inode) 文件的操作&#xff1a;建立&#xff0c;删除&#xff0c;打开&#xff0c;关闭&#xff0c;读&#xff0c;写 文件的保护&#xff1b;文件的逻辑结构&#xff1b;文件的物理结构目录 目录的基…

在Android系统中运行i2c tools

步骤 安装交叉编译工具 验证是否安装arm-none-eabi-gcc: arm-none-eabi-gcc -v安装&#xff1a;sudo apt install gcc-arm-none-eabi 安装 i2c-tools 下载i2c-tools源码: https://www.kernel.org/pub/software/utils/i2c-tools/ 编译 查看当前cpu架构:adb shell getprop r…

辅助驾驶ADAS功能算法介绍

一、ADAS功能分类 按照行驶域划分,将ADAS功能分为行车功能、泊车功能和主动安全功能。 行车功能 ACC(Adaptive Cruise Control)自适应巡航控制TJA(Traffic Jam Assist)交通拥堵辅助LCC(Lane Centering Control)车道居中控制ICC(Integration Cruise Control)智能巡航系…

const指针,星号判断方法

一 示例代码 1. const char *p // 指向常量的指针 2. char const *p // 指向常量的指针 3. char * const p // 指针常量二 判断方法 const在星号左边&#xff0c;指向常量的指针&#xff0c;指针p可修改。 const在星号右边&#xff0c;指针常量&#xff0c;指针p不可修改。

【Spring】DynamicDataSourceHolder 动态数据源切换

【Spring】DynamicDataSourceHolder 动态数据源切换 常见场景常见工具一、AbstractRoutingDataSource1.1、 定义 DynamicDataSourceHolder1.2、 配置动态数据源1.3、 在Spring配置中定义数据源1.4、在业务代码中切换数据源 二、Dynamic Datasource for Spring Boot2.1. 添加依赖…

Element plus 低版本弹窗组件添加拖拽功能

在使用element plus 弹窗组件el-dialog 的时候&#xff0c;由于自己组件库版本过低&#xff0c;所以就会缺失某些功能&#xff0c;比如弹窗组件的可拖拽功能。因为某些原因element plus 组件库又不能升级&#xff0c;所以此时就需要自己为弹窗组件添加拖拽功能。共分为一下四个…

斯坦福大学李飞飞教授分享:只有计算机和机器人具备空间智能,人工智能的潜力才能得到充分发挥

在最近李飞飞教授的TED演讲中&#xff0c;她深入探讨了空间智能对人工智能&#xff08;AI&#xff09;发展的深远影响。 今天&#xff0c;AI的发展也在经历类似的革命性变化。李飞飞教授回顾了计算机视觉的早期进展&#xff0c;介绍了她和团队在ImageNet上的努力&#xff0c;以…

英语学习笔记24——Give me/us/him/her/them some ...

Give me/us/him/her/them some … 给我/我们/他/她/他们一些…… 词汇 Vocabulary desk n. 课桌&#xff08;有书桌堂&#xff09;&#xff0c;写字台 复数&#xff1a;desks 搭配&#xff1a;desk mate 同桌    构成&#xff1a;desk mate 桌子上的伙伴 同桌    cl…

[Algorithm][动态规划][简单多状态DP问题][买卖股票的最佳时机 III][买卖股票的最佳时机 Ⅳ]详细讲解

目录 1.买卖股票的最佳时机 III1.题目链接2.算法原理详解3.代码实现 2.买卖股票的最佳时机 IV1.题目链接2.算法原理详解3.代码实现 1.买卖股票的最佳时机 III 1.题目链接 买卖股票的最佳时机 III 2.算法原理详解 注意&#xff1a;本题为了便于初始化&#xff0c;有较多细节服…

Ubuntu开发入门之“制作Ubuntu rootfs根文件系统镜像“

Ubuntu开发入门之“制作Ubuntu rootfs根文件系统镜像” 问题描述解决方法1.首先从官网下载最基础的ubuntu base核心文件,ubuntu core.2.接下来就是制作一个基础功能的根文件系统3.修改可用源4.接下来就是挂载根文件系统,进行模拟安装应用5.根文件系统安装常用的工具和配置用户…

Polar Si9000 远程桌面提示cannot checkout an uncounted license错误

Polar Si 9000 版本《Si9000e_2022_v22_03》安装完成之后指定到license时候提示如下&#xff1a; cannot checkout an uncounted license 修正办法将安装目录下的license用文档编辑工具&#xff08;记事本或者Notepad&#xff09;打开.lic文件&#xff0c;使用编辑器的替换功…

瑞萨RA8系列教程 | 基于e2s实现RA8串口输出配置

关注星标公众号&#xff0c;不错过精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 串口是最常见的通信方式之一&#xff0c;也是单片机调试最常见的通信接口&#xff0c;也是现在的单片机必备的通信接口&#xff0c;目前&#xff08;2024-05&#xff09;最新、最强…

【香橙派AIpro】开箱测评

1.板子开箱 哟&#xff0c;看起来还不错哦&#xff01;&#xff01;&#xff01; 收货清单&#xff1a; 主板*1 1.5m数据线*1 充电头*1 1.1.充电头 近65W的充电头&#xff0c;不错不错。 1.2.主板 1.2.1.上面 哇噢&#xff0c;还送了2.4/5G的WiFi和蓝牙天线。 emm&#xf…

卷出新高度,直呼太强!时隔三月,YOLO再度进化升级:《YOLOv10—实时端到端目标检测》重磅来袭

真的是不止一次感叹&#xff0c;学习的速度都跟不上发论文出新品的速度。。。。。 继前文YOLOv9发布以来也就不到三个月的时间&#xff0c;YOLOv10就来了&#xff01; 《太卷了&#xff0c;目标检测新成员——YOLOv9: Learning What You Want to LearnUsing Programmable Gra…

吴恩达2022机器学习专项课程C2W2:2.22 多类 softmax softmax与神经网络 softmax的代码改良 多标签分类

目录 多分类问题1.什么是多分类问题2.多分类问题案例3.二分类与多分类的区别 Softmax1. 什么是Softmax2.逻辑回归预测的计算过程3. Softmax预测的计算过程4.Softmax 回归与逻辑回归的关系5. Softmax的损失函数 softmax与神经网络1.设置Softmax层2.Softmax层的计算3.softmax激活…

卸载/删除 Maxask.com,最简单的方法

被绑架的浏览器&#xff0c;太恶心了。 Maxask伪装成了插件&#xff0c;在你搜索网页的时候利用了重定向&#xff0c;导致出现的界面时Maxask的界面&#xff0c;很恶心。 只需要排查正在使用的&#xff0c;如下图有颜色的图表。 删除一个插件&#xff0c;浏览器搜索一下看看有…