【JavaEE】_synchronized关键字——监视器锁monitor lock

目录

1. synchronized的特性

2. synchronized的使用

3. Java标准库中的线程安全类


1. synchronized的特性

(1)互斥:

前文已经介绍,某个线程执行到某个对象的synchronized中时,其他线程如果也执行到同一个对象,synchronized就会阻塞等待,进入synchronized修饰的代码块相当于加锁,退出synchronized修饰的代码块相当于解锁;

(2)刷新内存:

前文介绍内存可见性时已经提到:synchronized的工作过程是:

① 获得互斥锁,② 从内存拷贝变量的最新内存到寄存器,③ 执行代码,

④ 将更改后的共享变量的值刷新到寄存器,⑤ 释放互斥锁;

故而synchronized也可以保证内存的可见性;

(3)可重入:

同一个线程针对同一个锁连续加两次,如果出现了死锁就是不可重入,不会死锁就是可重入;

(3.1)死锁:

class Counter{public int count=0;synchronized public void increase(){synchronized (this){count++;}}
}

外层先加了一次锁,内层又对同一对象再次加锁,此时由于外层锁需要执行完内部代码才能解锁,而内层锁需要等待已经先锁的外层锁解锁后才能执行,此时就会形成死锁;

(3.2)可重入锁:

为了解决这个问题,JVM内部将synchronized实现为可重入锁。

可重入锁会记录当前占用锁的线程以及加锁次数,线程a第一次加锁成功后,锁内部就会记录当前占用锁的线程为a,同时加锁次数为1,后续线程a再加锁时,进行的加锁操作就非真实的加锁操作而是一个伪加锁,是没有实质影响的,只是将加锁次数增加为2;

代码执行完毕解锁时,会将计数-1,当锁的计数减到0时,才会真的解锁;

可重入锁降低了程序员的编写负担,降低了使用成本,提高了开发效率,但同时由于需要维护锁所属的线程以及加减计数会降低运行效率,程序的开销也会更大;

(3.3)死锁的必要条件:

① 互斥使用:一个锁被一个线程占用后,其他线程就无法占用;

② 不可抢占:一个锁被一个线程占用后,其他线程不能抢占该锁;

③ 请求与保持:当一个线程占据了多把锁之后除非显式释放锁,否则这些锁始终被该线程持有;

(以上三条都是锁本身的特点)

④ 环路等待:等待关系成环;

在实际开发中需要避免死锁,关键还是从避免环路等待入手:

针对多把锁加锁时约定好固定的顺序,就可以避免等待关系成环;

但实际情况中很少出现一个线程套锁的问题;

2. synchronized的使用

使用synchronized的本质是修改了Object对象中“对象头”内的一个标记;

(1)直接修饰普通方法:此时锁对象是this:

class Counter{public int count=0;synchronized public void increase(){count++;}
}

 当两个线程同时对同一个对象进行加锁的时候才存在竞争;

(2)修饰一个代码块:需要显式指定锁对象:

class Counter{public int count=0;public void increase(){synchronized (this){count++;}}}
public class Demo1 {private static Counter counter = new Counter();public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(()->{for(int i=0;i<50000;i++){counter.increase();}});Thread t2 = new Thread(()->{for(int i=0;i<50000;i++){counter.increase();}});t1.start();t2.start();t1.join();t2.join();System.out.println(counter.count);}
}

counter.increase()表示针对this对象进行加锁操作;

注:任何对象都可以进行加锁是java语言的特色;

(3)修饰一个静态方法:

静态方法其实就是类方法,普通方法就是实例方法;故而

synchronized修饰一个静态方法就相当于针对当前类的类对象加锁

class Counter{synchronized public static void func1(){}public static void fun2(){synchronized (Counter.class){}}
}

如在上文代码中,静态方法func1是表示为synchronized修饰的静态方法,其效果等效于静态方法func2;

注:(1)类对象就是运行程序时.class文件被加载到JVM内存中时的形态;

(2)使用synchronized很容易造成线程阻塞,一旦线程阻塞,此时放弃CPU,再次回到CPU的时间就不可控了,一旦代码中使用了synchronized,则“高性能”几乎无法实现;

3. Java标准库中的线程安全类

Java标准库中已经实现的类中有些是线程安全的,有些是线程不安全的:

线程不安全类:

①ArrayList ②LinkedList ③HashMap ④TreeMap ⑤HashSet ⑥TreeSet ⑦StringBuilder

线程安全类:

①Vector(不推荐) ②HashTable(不推荐)③ConcurrentHashMap ④StringBuffer ⑤String

注:(1)线程安全类由于一些关键方法都被synchronized修饰,保证了多线程环境下修改同一个对象不会出现线程不安全问题;

(2)String是线程安全类不是因为synchronized修饰,而是因为String是不可变对象,不存在多线程中修改造成的线程不安全问题;

同时请注意不可变对象与常量以及final没有必然联系:

不可变对象是指在该类中没有提供public的修改属性的方法,final修饰类表示类不可继承;

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

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

相关文章

2024 Sora来了!“手机Agent智能体”也来了!

近日&#xff0c;Open AI发布了能够根据文本生成超现实视频的工具Sora&#xff0c;多款震撼视频引爆科技圈刷屏&#xff0c;热度持续发酵占据AI领域话题中心&#xff0c;被认为是AGI实现过程里的重大里程碑事件。新一轮的人工智能浪潮给人类未来的生产和生活方式带来巨大而深远…

VPN | 世界那么大,我想“魔法”上网看看,可以吗?

Hi&#xff0c;大家好&#xff0c;我是半亩花海。世界那么大&#xff0c;我想“魔法”上网看看&#xff0c;可以吗&#xff1f;随着网络的发展与普及&#xff0c;畅游网络世界已成为人们生活的一部分。它给我们开拓了视野&#xff0c;增长了见闻&#xff0c;丰富了知识&#xf…

FISCO BCOS(二)———配置及使用控制台

一、前言 FISCO BCOS是由金融区块链合作联盟&#xff08;深圳&#xff09;与微众银行共同发起的开源区块链项目&#xff0c;支持多链多账本&#xff0c;满足金融行业复杂业务需求。本文将介绍如何在Ubuntu操作系统上使用Linux命令配置FISCO BCOS的控制台并进行get/set操作。 目…

React 模态框的设计(一)拖动组件的设计

春节终结束了&#xff0c;忙得我头疼。终于有时间弄自己的东西了。今天来写一个关于拖动的实例讲解。先看效果&#xff1a; 这是一个简单的组件设计&#xff0c;如果用原生的js设计就很简单&#xff0c;但在React中有些事件必须要多考虑一些。这是一个系列的文章&#xff0c;…

SpringBoot3整合elasticsearch8

版本 SpringBoot 3.0 Elasticsearch 8.12.1 依赖 我使用的 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> 还可以用&#xff0c;但我没用…

YOLOv9来咧!

文章目录 论文:主要内容一、提出使用PGI&#xff08;Programmable Gradient Information&#xff0c;可编程梯度信息&#xff09;来解决信息瓶颈问题和深度监督机制不适合轻量级神经网络的问题。二、设计了GELAN&#xff08;Generalized ELAN &#xff0c;广义ELAN&#xff09;…

LLM 模型融合实践指南:低成本构建高性能语言模型

编者按&#xff1a;随着大语言模型技术的快速发展&#xff0c;模型融合成为一种低成本但高性能的模型构建新途径。本文作者 Maxime Labonne 利用 mergekit 库探索了四种模型融合方法&#xff1a;SLERP、TIES、DARE和passthrough。通过配置示例和案例分析&#xff0c;作者详细阐…

Ansible playbook 剧本部署WEB NFS rsync sersync(及时监控)架构

ansible playbook剧本介绍&#xff1a; playbook 是ansible用于配置&#xff0c;部署和管理被节点的剧本 由一个或多个模块组成&#xff0c;完成统一的目的&#xff0c;实现自动化操作 剧本编写需遵循yaml语法 yaml的三要素&#xff1a; 缩进&#xff1a;两个字符&#xff0c;默…

【Vue3】toRefs和toRef在reactive中的一些应用

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

快速上手vue指南

Vue.js 是一款非常流行且易于上手的前端框架&#xff0c;用于构建用户界面和单页应用程序&#xff08;SPA&#xff09;。它以其简洁的API、灵活的组件系统和高效的性能著称。如果你是初学者&#xff0c;以下是一些关键步骤和建议&#xff0c;可以帮助你快速上手 Vue.js。 1. 理…

【Qt】实现 Ctrl + 鼠标滚轮 缩放文本功能

【Qt】实现 Ctrl 鼠标滚轮 缩放文本功能 文章目录 I - 实现自定义控件II - 完整代码III - 参考链接 I - 实现自定义控件 主要原理 继承 QTextEdit 或者 QPlainTextEdit 类&#xff0c;重写滚轮事件 wheelEvent, QTextEdit 和 QPlainTextEdit 中均包含此函数 头文件 TextEdit…

学习springMVC第二天

REST简介 REST(Representational State Transfer)&#xff0c;表现形式状态转换 传统风格资源描述形式 http://localhost/user/getById?id1 http://localhost/user/saveUser REST风格描述形式 http://localhost/user/1 http://localhost/user 优点&#xff1a; 隐藏资源的访问…

C++模板->模板的概念、函数模板基本语法、函数模板注意事项、普通函数与函数模板区别、普通函数与函数模板调用规则、模板的局限性

#include<iostream> using namespace std; //交换两个整型函数 void swapInt(int& a, int& b) { int temp a; a b; b temp; } //交换两个浮点型函数 void swapDouble(double& a, double& b) { double temp a; a b; b te…

MATLAB中gtext函数用法

目录 语法 说明 示例 使用鼠标将文本添加到图窗 指定字体大小和颜色 在创建后修改文本 gtext函数的功能是使用鼠标将文本添加到图窗。 语法 gtext(str) gtext(str,Name,Value) t gtext(___) 说明 gtext(str) 在使用鼠标选择的位置插入文本 str。当将鼠标指针悬停在图…

Oracle普通用户启停JOB报错ORA 27486权限不足

Oracle普通用户启停JOB报错ORA 27486权限不足 问题与现象原因与对策 问题与现象 应用用户通过DBMS_SCHEDULER启停自己的JOB需要的权限&#xff1a; grant execute on dbms_scheduler to appuser;该普通用户有CREATE JOB的权限。通过DBMS_SCHEDULER停止自己的JOB时&#xff1a…

3个wordpress中文企业主题模板

农业畜牧养殖wordpress主题 简洁大气的农业畜牧养殖wordpress主题&#xff0c;农业农村现代化&#xff0c;离不开新农人、新技术。 https://www.jianzhanpress.com/?p3051 老年公寓wordpress主题 浅绿色简洁实用的老年公寓wordpress主题&#xff0c;适合做养老业务的老年公…

高标准农田仪器设备

在当今社会中&#xff0c;农业已经逐渐走向了一条科技化、智能化的道路。高标准农田建设成为了现代化农业发展的一个重要方向。为了更好地提高农产品的产量和品质&#xff0c;科技人员们不断地在农田设备上进行创造性的改进与升级&#xff0c;以达到更加高效、节能、环保、智能…

SouthLeetCode-打卡24年02月第3周

SouthLeetCode-打卡24年02月第3周 // Date : 2024/02/12 ~ 202X/02/18 049.反转字符串 (1) 题目描述 049#LeetCode.344.简单题目链接#Monday2024/02/12 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分…

【C语言】注释

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

计算机网络--物理层练习题

习题 下列说法正确的是&#xff08;D&#xff09; A 信道与通信电路类似&#xff0c;一条可通信的电路往往包含一个信道 信道不等于通信电路&#xff0c;一条可双向通信的电路往往包含两个信道&#xff1a;一个是发送信道&#xff0c;一条是接收信道。另外&#xff0c;多个通…