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数据结构之《链式线性表的插入与删除》问题

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

【开源】基于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函数将自定义分词器应用于数据集…

Linux:进程状态

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

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

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

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

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

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

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

【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基础指令与权限之后,Linux系统开发工具的使用…

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

【大家好,我是爱干饭的猿,本文重点介绍DataFrame的组成、DataFrame的代码构建、DataFrame的入门操作、词频统计案例、电影数据分析、SparkSQL Shuffle 分区数目、SparkSQL 数据清洗API、DataFrame数据写出、DataFrame 通过JDBC读写数据库(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代理的分类:路由式代理、VLAN内的ARP代理、VLAN间的ARP代理。 6…

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

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

HarmonyOS入门开发(三) 持久化存储Preferences

接入鸿蒙几天以来,发现各种和Android不一样的地方,今天来看一下Preferences存储 在Android中比如有ShardPreferences、Mmkv这些持久化存储方式,开发起来很方便,读取速度也很快,在鸿蒙里面也提供了对应的持久化存储方案…

‘tsc‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

最近在用nodejs typescript 某游戏服务器在做一些研究 nodejs-tcs 问题描述: 1.使用命令npm install -g typescript安装typescript后,输入 tsc命令,一直报错 tsc 不是内部或外部命令,也不是可运行的程序 或批处理文件。 2.目…

VBA代码解决方案第8讲:用FindPrevious进行重复搜索及利用LIKE查找

《VBA代码解决方案》(版权10028096)这套教程是我最早推出的教程,目前已经是第三版修订了。这套教程定位于入门后的提高,在学习这套教程过程中,侧重点是要理解及掌握我的“积木编程”思想。要灵活运用教程中的实例像搭积木一样把自己喜欢的代码…

LeetCode(44)存在重复元素 II【哈希表】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 存在重复元素 II 1.题目 给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在&#xff0c;返回 true &#xf…

【UE】UEC++委托代理

【UE】UEC委托代理 一、委托的声明与定义 #pragma once#include "CoreMinimal.h" #include "GameFramework/GameModeBase.h" #include "DelegateGameMode.generated.h"// // Declare DECLARE_DELEGATE // DECLARE_DELEGATE(FDeclareDelegate_…

【Linux】:信号(一)产生

信号 一.前台进程和后台进程1.前台进程2。后台进程3.总结 二.自定义信号动作接口三.信号的产生1.键盘组合键2.kill信号进程pid3.系统调用1.kill函数2.raise函数3.abort函数 四.异常五.软件条件六.core文件 一.前台进程和后台进程 1.前台进程 一个简单的代码演示 像这种程序在…

java中反射知识点概念

这里写自定义目录标题 1.什么是反射--动态注入&#xff1f;2.反射的诞生背景3.反射的意义4.反射后可以做些什么5.反射相关的主要API6.反射的优缺点7.反射和不反射基础使用8.工厂模式使用反射8.1首先我们来看看不使用反射的情况&#xff1a;8.2使用反射的情况&#xff1a; 9.Jav…