【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;…

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;也欢…

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。当将鼠标指针悬停在图…

3个wordpress中文企业主题模板

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

高标准农田仪器设备

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

【C语言】注释

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

【国际化】用JQuery-i18next的国际化demo,引入json

参考&#xff1a; 使用 i18next 的 jQuery 国际化 &#xff08;i18n&#xff09; 渐进式指南 (locize.com) i18next-http-backend/example/jquery/index.html at master i18next/i18next-http-backend (github.com) 文档 可能需要解决一下跨域问题&#xff0c;因为浏览器读取本…

Unity学习之Unity中的MVC思想

文章目录 1 前言2 MVC的基本概念3 不使用MVC思想制作UI逻辑3.1 拼面板3.2 面板脚本3.3 角色面板逻辑3.4 角色升级 4 使用MVC思想制作UI逻辑4.1 Model数据脚本4.2 View界面脚本4.2.1 MainView主界面4.2.2 RoleView 角色面板界面 4.3 Controller业务逻辑脚本4.3.1 MainController…

phaseDNN文章解读

文章DOI: https://doi.org/10.48550/arXiv.1905.01389 作者是 Southern Methodist University 的Wei Cai 教授 A Parallel Phase Shift Deep Neural Network for Adaptive Wideband Learning 一种并行移相深度神经网络来自适应学习宽带频率信号 20190514 核心思想&#xff1a;…

跟着pink老师前端入门教程(JavaScript)-day05

六、语句 &#xff08;一&#xff09;表达式和语句 1、表达式 表达式是可以被求值的代码&#xff0c;JavaScript 引擎会将其计算出一个结果。 2、语句 语句是一段可以执行的代码。 比如&#xff1a; prompt() 可以弹出一个输入框&#xff0c;还有 if语句 for 循环语句等…

Socks5代理IP详解:优势与应用场景

Socks5代理IP作为网络代理技术的前沿选择&#xff0c;其在多方面的优势使其在2024年成为了热门选择。 一、Socks5代理IP的核心特性 1、Socks5代理IP与其他代理类型的比较 HTTP代理设计用于web浏览&#xff0c;仅支持HTTP和HTTPS协议。 Socks4代理支持更多类型的网络协议&…

欧拉回路和欧拉路径

在一张图中&#xff0c;从一个点出发每条边经过且只经过一次得到的路径&#xff0c;如果最后回到起点&#xff0c;那么就是欧拉回路&#xff0c;如果最后没有回到起点&#xff0c;那么得到的就是欧拉路径。 在无向图中&#xff0c;欧拉路径满足的要求是&#xff0c;除了起点和…

DM数据库学习之路(十六)DEM部署DM8DPC集群

DEM部署DPC集群 DPC准备工作 在所有安装DPC服务器上部署dmagent&#xff0c;dmagent的运行环境需要依赖JAVA环境&#xff0c;JAVA版本必须为JAVA1.8。 创建用户 所有安装DPC服务器&#xff0c;手工建dmdba用户 # groupadd dinstall # useradd -g dinstall -d /home/dmdba…