java EE初阶 — synchronized 关键字 - 监视器锁 monitor lock

news2024/11/25 4:42:18

文章目录

    • 1.synchronized 的特性
      • 1.1 互斥
      • 1.2 可重入
    • 2.synchronized 使用示例
    • 3.Java 标准库中的线程安全类

1.synchronized 的特性

1.1 互斥

synchronized 会起到互斥效果, 某个线程执行到某个对象的 synchronized 中时, 其他线程如果也执行到同一个对象 synchronized 就会阻塞等待

  • 进入 synchronized 修饰的代码块,相当于 加锁
  • 退出 synchronized 修饰的代码块,相当于 解锁


可以粗略理解成,每个对象在内存中存储的时候,都存有一块内存表示当前的 “锁定” 状态(类似于厕
所的 “有人/无人”).。
如果当前是 “无人” 状态,那么就可以使用,使用时需要设为 “有人” 状态。
如果当前是 “有人” 状态, 那么其他人无法使用,只能排队。

阻塞等待:

针对每一把锁,操作系统内部都维护了一个等待队列。当这个锁被某个线程占有的时候,其他线程尝试进行加锁, 就加不上了,就会阻塞等待, 一直等到之前的线程解锁之后,由操作系统唤醒一个新的线程, 再来获取到这个锁。

1.2 可重入

一个线程针对同一个对象,如果不会发生问题就叫可重入的,否则就叫不可重入的

class Counter {
    public int count = 0;

    synchronized public void add() {
        synchronized(this) {
            count++;
        }
    }
}

锁对象是 this ,只要有线程调用 add 方法,进入 add 方法的时候,
在可以加锁成功的前提下,就会先加锁。紧接着又遇到了代码块,此时会再次尝试加锁。

站在 锁对象的视角(this),他认为自己已经被其他的线程给占用了,
那么这里的第二次加锁是不需要阻塞等待的。

如果允许上述操作,这个锁就是可重入的;不允许就是不可重入的。
如果是不可重入的,就会发生 死锁。

上面演示的就是一个不可重入引起的死锁现象。



下面演示的是可重入的情况。



java 为了避免不小心出现闭锁现象,就把 synchronized 给设置成可重入的了。
因此 java 中的 synchronized 是可重入锁。

2.synchronized 使用示例

修饰普通方法:

public synchronized void add2() {
    count++;
}

修饰静态方法:

public synchronized static void add2() {
    count++;
}

重点理解 synchronized 锁的意思。

两个线程调试竞争一把锁才会发生阻塞等待,如果是两把锁就不会了。

修饰代码块:

synchronized public void add() {
    synchronized(this) {
        count++;
    }
}

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

如果多个线程操作同一个集合类,就需要考虑到线程安全问题的事情。

  • ArrayList
  • LinkedList
  • HashMap
  • TreeMap
  • HashSet
  • TreeSet
  • StringBuilder

这些类在没有线程安全问题的时候,放心使用。
在有安全问题的时候,可以手动加锁使用。

这些类有更多的选择空间。

  • Vector
  • HashTable
  • ConcurrentHashMap
  • StringBuffer

这些类当中内置了 synchronized 加锁。相对于上面的类更安全。

因为是强行加锁的,不管是需不需要,它都会加锁,而且加锁是有额外的时间开销的。
因此它的选择空间变小了,是不推荐使用的。

  • String

这个类虽然没有加锁,但是也是安全的,因为它不涉及修改。

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

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

相关文章

大数据培训之Hadoop序列化

序列化概述 1.1什么是序列化 序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便 于存储到磁盘(持久化)和网络传输。 反序列化就是将收到字节序列(或其他数据传输协议)或者是磁盘的持久化 数据,转换成内存中的对象。 1.2为什么要序列化 一般来说&am…

【leetcode】2259. 移除指定数字得到的最大结果(js实现)

1. 题目 2259. 移除指定数字得到的最大结果 2. 思路 根据题意进行模拟,每次找到与digit相同的元素就将其移除,将剩余的字符串与存储最大值的字符串进行比较,一直保持max中保存的是最大值,最终将max返回。 3. 代码 /*** para…

用强化学习玩《超级马里奥》

Pytorch的一个强化的学习教程( Train a Mario-playing RL Agent)使用超级玛丽游戏来学习双Q网络(强化学习的一种类型),官网的文章只有代码, 所以本文将配合官网网站的教程详细介绍它是如何工作的,以及如何将它们应用到…

[附源码]Python计算机毕业设计SSM科技类产品众筹系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

[附源码]计算机毕业设计JAVA乡村振兴惠农推介系统

[附源码]计算机毕业设计JAVA乡村振兴惠农推介系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM myb…

项目ERP与传统ERP的区别是什么?

许多不认为传统 ERP 有用的企业正在寻找项目 ERP。对于企业软件来说,这是一种利用项目管理实践和功能的相对新颖的方法。与传统 ERP 相比,项目 ERP 旨在提供对公司流程更全面的概述。这种类型的解决方案对于建筑公司或项目制造商等项目公司来说是一个很好…

聚类基本概念及常见聚类算法和EM算法

1. 基本概念 1.1 定义 聚类:发现数据中分组聚集的结构,根据数据中样本与样本之间的距离或相似度,依据类内样本距离小(相似度大)、类间样本距离大(相似度小)将样本划分为若干组/类/簇。 基于划分…

【毕业设计】1-基于单片机的城市轨道交通列车超速防护系统_里程表设计(原理图+PCB+源码+仿真工程+答辩论文)

typora-root-url: ./ 【毕业设计】1-基于单片机的城市轨道交通列车超速防护系统_里程表设计(原理图PCB源码仿真工程答辩论文) 文章目录typora-root-url: ./【毕业设计】1-基于单片机的城市轨道交通列车超速防护系统_里程表设计(原理图PCB源码…

postgres源码解析39 表创建执行全流程梳理--3

本文结合实例讲解表创建执行流程 [CREATE TABLE wp_shy(id int primary key, name carchar(20))],相关知识回顾见: postgres源码解析38 表创建执行全流程梳理–1 postgres源码解析38 表创建执行全流程梳理–2 执行流程图 transformCreateStmt函数是表创建真正的入口…

系统封装制作

工具网址: 镜像下载: Windows 10 22H2 - MSDN - 山己几子木 (sjjzm.com)pe工具:【新提醒】优启通 v3.7.2022.0910(2022.10.14 发布)_IT天空原创软件_IT天空 (itsk.com)万能驱动:万能驱动 v7.22.0912.2&…

国产全志T3+Logos FPGA开发板(4核ARM Cortex-A7)规格书

评估板简介 创龙科技TLT3F-EVM是一款基于全志科技T3四核ARM Cortex-A7 + 紫光同创Logos PGL25G/PGL50G FPGA设计的异构多核国产工业评估板,ARM Cortex-A7处理器单元主频高达1.2GHz。评估板由核心板和评估底板组成,核心板CPU、FPGA、ROM、RAM、电源、晶振、连接器等所有器件均…

[附源码]计算机毕业设计springboot企业售后服务管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

如何学习运放实战设计?学这些精髓

一、同相放大电路虚短:运放理想放大倍数10万倍,一般输出都是3V或5V较多,运放放大的是输入信号的压差,放大10万倍的话,只能说明输入信号的压差非常非常接近,近似相等,我们称之为虚短(…

多功能便携式吸尘器设计

目 录 摘 要 i Abstract ii 1 引言 1 2 多功能便携式吸尘器的历史及发展 2 2.1 多功能便携式吸尘器的历史 2 2.2 业界的发展情况 3 3 多功能便携式吸尘器的分类 5 3.1 卧式(Canister) 5 3.2 立式(Upright) 5 3.3 手持式 &#xff…

[附源码]SSM计算机毕业设计学校失物招领系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Jetbrains idea整合远程的docker服务器

Jetbrains idea整合远程的docker服务器准备工作服务端准备开发环境准备整合远程服务器的步骤服务端配置客户端配置准备工作 服务端准备 首先我们需要一台远程的安装了docker的CentOS服务器(其他Linux服务器的操作区别不大),课参考我的文章&…

防水蓝牙耳机哪个好?防水音质好的蓝牙耳机推荐

真无线蓝牙耳机即将成为人们日后必不可少的东西,它已经逐渐成为我们生活中最重要的听觉媒介,是有线耳机给不了的自由感,有一些蓝牙耳机还可以让你在下雨天没带雨伞时依然可以带着听歌,今天给大家介绍四款防水能力极好的蓝牙耳机&a…

【发表案例】智能物联网类SCIEI,仅25天录用,计算机领域必投SCI快刊,12月截稿

【期刊简介】3.5-4.0,JCR2区,中科院3区 【检索情况】SCI&EI双检,正刊 【征稿领域】基于人工智能的工业物联网智能传感器 【参考周期】3个月左右 【截稿日期】2022年12月30日 【期刊简介】2.0-3.0,JCR3区,中科院…

fastapi_No.24_日志记录系统

文章目录第一步:创建日志记录器第二步:挂载日志记录器第三步:使用日志记录第四步:清除日志记录器完整代码第一步:创建日志记录器 利用loguru包创建一个日志记录器。 from loguru import logger from datetime import…

快速提升中小企业销售效率的5个自动化小技巧

成长期的中小企业,如何提升销售/市场部效率就是CEO/COO/CMO/销售VP们非常关心的一个话题。销售效率的计算很简单,通常用销售团队的总收入除以销售团队的工资、福利、办公成本等。举例,如果一个30人的销售团队,一年的销售收入是500…