synchronized 关键字

目录

1 synchronized 的特性

1)互斥

2) 刷新内存(内存可见性)

3) 可重入

2 synchronized 使用示例

 1) 直接修饰普通方法:

2) 修饰静态方法:

3) 修饰代码块:        

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


1 synchronized 的特性

1)互斥

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

        进入 synchronized 修饰的代码块, 相当于 加锁        

        退出 synchronized 修饰的代码块, 相当于 解锁

        bbc84eff6ac24964b2ea7d07bd5e3ebf.png 

            synchronized用的锁是存在Java对象头里的。

            synchronized的底层是使用操作系统的mutex lock实现的.

         e9b5c4e6d9424f58903531825b98e6eb.png

理解 " 阻塞等待".
  •         针对每一把锁, 操作系统内部都维护了一个等待队列. 当这个锁被某个线程占有的时候, 其他线程尝试进行加锁, 就加不上了, 就会阻塞等待, 一直等到之前的线程解锁之后, 由操作系统唤醒一个新的线程, 再来获取到这个锁.
注意 :
  •        上一个线程解锁之后, 下一个线程并不是立即就能获取到锁. 而是要靠操作系统来 "唤醒". 这也就是操作系统线程调度的一部分工作.
  •         假设有 A B C 三个线程, 线程 A 先获取到锁, 然后 B 尝试获取锁, 然后 C 再尝试获取锁, 此时 B 和 C 都在阻塞队列中排队等待. 但是当 A 释放锁之后, 虽然 B 比 C 先来的, 但是 B 不一定就能 获取到锁, 而是和 C 重新竞争, 并不遵守先来后到的规则.

2) 刷新内存(内存可见性)

synchronized 的工作过程:
  1.  获得互斥锁
  2.  从主内存拷贝变量的最新副本到工作的内存
  3.  执行代码
  4.  将更改后的共享变量的值刷新到主内存
  5.  释放互斥锁

所以 synchronized 也能保证内存可见性. 与 volatile相似。 

3) 可重入

synchronized 同步块对同一条线程来说是可重入的,不会出现自己把自己锁死的问题;

 代码示例

  •         在下面的代码中,  increase 和 increase2 两个方法都加了 synchronized, 此处的 synchronized 都是针对 this 当前 对象加锁的.
  •         在调用 increase2 的时候, 先加了一次锁, 执行到 increase 的时候, 又加了一次锁. (上个锁还没释放, 相当于连续加两次锁)

//一,针对this对象
static class Counter {public int count = 0;synchronized void increase() {count++;}synchronized void increase2() {increase();}
}
//二,针对lockerprivate static Object locker = new Object();Thread t1 = new Thread(() -> {synchronized (locker1) {// 此处的 sleep 很重要. 要确保 t1 和 t2 都分别拿到一把锁之后, 再进行后续动作.synchronized (locker1) {System.out.println("t1 加锁成功!");}}});

  这个代码是完全没问题的. 因为 synchronized 是可重入锁.

在可重入锁的内部, 包含了 "线程持有者" 和 "计数器" 两个信息.
  •         如果某个线程加锁的时候, 发现锁已经被人占用, 但是恰好占用的正是自己, 那么仍然可以继续获取 到锁, 并让计数器自增.
  •         解锁的时候计数器递减为 0 的时候, 才真正释放锁. (才能被别的线程获取到)

2 synchronized 使用示例

     synchronized 本质上要修改指定对象的 "对象头". 从使用角度来看, synchronized 也势必要搭配一个具体的对象来使用.

 1) 直接修饰普通方法:

        锁的 SynchronizedDemo 对象

public class SynchronizedDemo {
public synchronized void methond() {
}
}

2) 修饰静态方法:

        锁的 SynchronizedDemo 类的对象 

public class SynchronizedDemo {
public synchronized static void method() {
}
}

3) 修饰代码块:        

明确指定锁当前哪个对象
//1. 锁当前this对象
public class SynchronizedDemo {
public void method() {
synchronized (this) {
}
}
}
//2.锁类对象
public class SynchronizedDemo {
public void method() {
synchronized (SynchronizedDemo.class) {
}
}
}

两个线程竞争同一把锁, 才会产生阻塞等待.  

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

这些是线程安全的. 使用了一些锁机制来控制.
  • Vector (不推荐使用)
  • HashTable (不推荐使用)
  • ConcurrentHashMap
  • StringBuffer
    核心方法都带有 synchronized .

 结语:synchronized的相关分享到这里就结束了,希望对大家的学习会有帮助,如果大家有什么问题或者不同的见解,欢迎大家评论区的留言, 感谢支持 !!!

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

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

相关文章

java之while循环

java之while循环 用法简介 用法简介 Java中的while循环是一种基本的控制流语句,它允许您在满足某个条件的情况下重复执行一段代码。以下是while循环的基本语法: while (condition) { // code to be executed while the condition is true }其中&…

Java数据结构之《链式线性表的插入与删除》问题

一、前言: 这是怀化学院的:Java数据结构中的一道难度中等偏下的一道编程题(此方法为博主自己研究,问题基本解决,若有bug欢迎下方评论提出意见,我会第一时间改进代码,谢谢!) 后面其他编程题只要我…

C++设计模式——建造者模式(Builder)

一、什么是建造者模式? 建造者模式是一种创建型的软件设计模式,用于构造相对复杂的对象。 建造者模式可以将复杂对象的构建与它的表示分离,使得相同的构建过程可以得到不同的表示。如果说工厂模式和抽象工厂模式更注重产品整体,…

程序员的吐槽

在职场中,每个人都可能遇到让自己不满的领导或同事。这位工作了7年的程序员,今天就要吐槽一下他职场中的种种不快。 一、领导的“关爱” 1. 瞎指挥 这位程序员所在的公司规模不大,领导对技术一窍不通,却喜欢对技术团队指手画脚。…

【开源】基于Vue+SpringBoot的智能教学资源库系统

项目编号: S 050 ,文末获取源码。 \color{red}{项目编号:S050,文末获取源码。} 项目编号:S050,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课…

Android中添加C或C++代码

1、创建cpp目录,用于存放C和C代码。 2、创建CMake构建脚本CMakeLists.txt文件,将其放在cpp目录中。 # Sets the minimum version of CMake required to build the native library. cmake_minimum_required(VERSION 3.22.1)# Declares and names the pro…

AI模型训练——入门篇(二)

导语:本文主要介绍了基于BERT的文本分类方法,通过使用huggingface的transformers库实现自定义模型和任务。具体步骤包括:使用load_dataset函数加载数据集,并应用自定义的分词器;使用map函数将自定义分词器应用于数据集…

vue运用之el-cascader组件

前言 el-cascader 是 Element UI 的级联选择器组件。以下是一些常见的 el-cascader 问题以及对应的案例代码。 1. 如何使用 el-cascader 创建一个级联选择器 以下是一个简单的 el-cascader 示例: <template> <el-cascader v-model="selected" :option…

Linux:进程状态

目录 1.Linux内核关于进程状态的源代码 2. 运行状态 3. 阻塞状态 4. 挂起 5.Linux中的进程状态 5.1 睡眠状态 5.2 暂停状态 5.3 僵尸进程与孤儿进程 我们在学习进程状态时&#xff0c;老师只是简单的让我们记住下面这张图 1.教材中进程操作系统的进程状态 那么这些…

分享常见msvcp140.dll丢失的解决方法,msvcp140.dll修复的问题

在使用电脑的过程中可能会出现关于msvcp140.dll丢失的问题&#xff0c;通常出现这样的问题都会导致电脑中的程序出现不能正常运行的情况。并且如果不及时将msvcp140.dll修复的话可能还会导致电脑出现其他的问题。这篇文章就将给大家介绍关于msvcp140.dll丢失的解决方法。 一.常…

基于安卓的2048益智游戏的设计与实现

基于安卓的2048益智类游戏的设计与实现 摘要&#xff1a;现如今随着社会日新月异&#xff0c;人们越来越离不开智能手机所提供的灵活性与便携性。安卓系统是在这股手机发展迅猛的潮流中其市场占有率过半的手机平台&#xff0c;基于安卓系统的游戏开发有着不可估量的前景。 本论…

抖音、快手、新东方来袭,旅游行业战火再起?

低调了许久的旅游行业&#xff0c;终于迎来了大复苏&#xff0c;旅客的出游热情也再度被点燃&#xff0c;出游人数呈现出不断攀升态势。以“十一”黄金周为例&#xff0c;据文化和旅游部数据中心统计&#xff0c;本次黄金周&#xff0c;国内旅游出游人数8.26亿人次&#xff0c;…

jupyter notebook 添加conda环境变量为内核(kenel)

第一步&#xff1a;安装ipykernel 在激活环境后&#xff0c;需要安装ipykernel包&#xff0c;以便将Conda环境添加到Jupyter Notebook中。使用以下命令安装&#xff1a; pip install ipykernel第二步&#xff1a;将Conda环境添加到Jupyter 需要将Conda环境添加到Jupyter Not…

Java for/forEach 不支持重新賦值

loop中不支持變量重新賦值 Local variable printTotal defined in an enclosing scope must be final or effectively final 需要優化&#xff0c;這樣寫太羅嗦。 JasperPrint printTotal null;for(JasperPrint print:printList) {if(printTotalnull) {/*********************…

echarts 对数坐标轴

echarts 对数坐标轴 描述 Echarts 柱状图数据大小差距过大&#xff0c;例如一个值是100000&#xff0c;一个值是5&#xff0c;值小的柱子就不会显示出来。 解决&#xff0c;使用对数坐标轴 option {tooltip: {trigger: axis,},xAxis: {type: category,data: [Mon, Tue, We…

【Linux基础开发工具】yum生态vim的配置与使用

目录 前言 1. Linux 软件包管理器 yum 1.1 什么是yum 1.2 快速上手yum 1.3 yum生态 2. Linux编辑器vim 2.1 vim的模式 2.2 vim使用技巧 3. vim编辑器辅助功能配置 3.1 配置 3.2 用户sudo权限配置 总结 前言 Linux基础指令与权限之后&#xff0c;Linux系统开发工具的使用…

【SparkSQL】DataFrame入门(重点:df代码操作、数据清洗API、通过JDBC读写数据库)

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍DataFrame的组成、DataFrame的代码构建、DataFrame的入门操作、词频统计案例、电影数据分析、SparkSQL Shuffle 分区数目、SparkSQL 数据清洗API、DataFrame数据写出、DataFrame 通过JDBC读写数据库&#xff08;MyS…

DHCP、ARP、FTP、DNS、VRRP、STP、报文交互流程

目录 一、DHCP 1、DHCP终结 1、DHCP discover 2、DHCP offer 3、DHCP request 4、DHCP ack 5、DHCP request 6、DHCP 续租 2、DHCP终结 二、ARP 1、ARP类型 动态ARP 静态ARP ARP代理 ARP代理的分类&#xff1a;路由式代理、VLAN内的ARP代理、VLAN间的ARP代理。 6…

行情分析——加密货币市场大盘走势(11.30)

大饼已经形成了底背离&#xff0c;即MACD往下走&#xff0c;而价格还在往上走&#xff0c;这种往往后续会大跌。我们继续把空单拿好&#xff0c;已经持仓的无需加仓。多次上涨都一直不能突破&#xff0c;也说明多空和空军力量都很强&#xff0c;等待后续出方向&#xff0c;而笔…