[JAVAee]synchronized关键字

news2024/11/26 18:45:34

目录

1.synchronized的特性

①互斥性

②可重入性

2.synchronized的使用示例

①修饰普通方法

②修饰静态方法

③修饰代码块


1.synchronized的特性

①互斥性

 互斥性,就像是给门上锁了一样.

 当A线程使用了被synchronized修饰的代码块并对其上锁,其他线程(B线程,C线程)想要使用这个代码块的时候就会调整为阻塞的状态.

 当A线程执行完这个被synchronized修饰的代码块后,跳出这个代码块.此时,相当于解锁.

 在解锁后,B线程与C线程就可以通过被随机调度来使用这个代码块.(因为线程间的调度是随机的,B,C线程都想要使用这个代码块,但是并不会遵循先来后到的顺序.在A使用的时候,他们都为阻塞状态.是会被操作系统在B,C中随机唤醒一个来使用)

②可重入性

被synchronized修饰就像被上锁了一样,有着可重入性这一特征.也被称为可重入锁,而可重入锁也可以叫做递归锁.

 什么是可重入性呢?就是在线程A进入被synchronized修饰的代码块后,代码块中可能又调用了这个同一个方法(像是递归).此时代码块是上锁的状态,但因为synchronized是可重入性的锁.在检测到再次进入这个代码块的线程和之前对其上锁的线程是同一个的时候.就可以再次进入此代码块.

2.synchronized的使用示例

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

被synchronized修饰的代码块,也被称为"同步代码块"

①修饰普通方法

此处ListNode类上的valAdd方法被synchronized修饰,当任意线程调用到这个方法的时候,被上锁的其实是使用这个方法的实例对象.

像是此处,线程0与线程1都分别调用了listNode0这个实例对象,再调用到valAdd方法.所以被上锁的其实是listnode0这个对象,此时的listnode0对象的属性与方法都是不可被其他线程调用的.

class ListNode{
    int val;
    ListNode next;
    public ListNode(int val){
        this.val = val;
    }
    public synchronized void valAdd(ListNode cur){//被synchronized修饰的普通方法
        cur.val = cur.val + 1;
    }
}

public class Test4 {
    public static void main(String[] args) throws InterruptedException {
        ListNode listNode0 = new ListNode(0);
        
        Thread thread0 = new Thread(() -> {
            listNode0.valAdd(listNode0);
        });
        
        Thread thread1 = new Thread(() -> {
            listNode0.valAdd(listNode0);
        });
        
        thread0.start();
        thread1.start();
        thread0.join();
        thread1.join();
        System.out.println(listNode0.val);
    }
}

②修饰静态方法

当synchronized修饰的是一个类方法时,被上锁的其实是Test4这个类对象.但他的上锁范围只有被synchronized修饰的类方法,其他没有被synchronized修饰的类方法是可以被其他线程调用的.

public class Test4 {
    static int n = 0;
    public static synchronized void add(){
        n = n + 1;
    }
    public static void main(String[] args) throws InterruptedException {
        Thread thread0 = new Thread(() -> {
            add();
        });
    }
}
public class Test4 {
    static int n = 0;
    public static synchronized void add(){
        n = n + 1;
    }
    public static void ADD(){//像这里,没有被synchronized修饰的类方法,其他线程也可以访问到
        n = n + 1;
    }
    public static void main(String[] args) throws InterruptedException {
        Thread thread0 = new Thread(() -> {
            for(int i = 0; i < 10000;i++){
                add();
            }
        });
        Thread thread1 = new Thread(() -> {
            for(int i = 0; i < 10000;i++){
                ADD();
            }
        });
        thread0.start();
        thread1.start();
        thread0.join();
        thread1.join();
        System.out.println(n);
    }
}

这个n != 20000的结果也证明了这个观点 

③修饰代码块

synchronized修饰一个代码块,括号里的是要被上锁的对象.即哪一个对象调用了这个方法并进入了这个代码块,哪一个对象就会被上锁

public synchronized void add(){
        synchronized (this){
            n = n + 1;
        }
    }

这里就是进入此代码块,就会将指定的类对象上锁. 

public synchronized void add(){
        synchronized (Test4.class){
            n = n + 1;
        }
    }

使用synchronized的时候,首先要明白的是被上锁的对象是什么.只有线程间想给同一个对象上锁的时候才会造成线程的阻塞.

如果两个线程要给不同的对象上锁,他们是不会产生阻塞等待的.


 

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

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

相关文章

从零开始学习自动驾驶路径规划-环境配置

从零开始学习自动驾驶路径规划-环境配置 前面&#xff0c;每个人遇到的问题不一样&#xff0c;这里记录了配置步骤和目前遇到的问题&#xff0c;会持续更新报错解决方法。配置时有报错请认真看报错经验 环境配置步骤&#xff08;18.04和20.04都可以&#xff0c;有些问题没遇到…

流媒体视频融合平台EasyCVR更新版本后,首页无法打开的原因排查与解决

EasyCVR视频融合平台基于云边端一体化架构&#xff0c;可支持多协议、多类型设备接入&#xff0c;包括&#xff1a;NVR、IPC、视频编码器、无人机、车载设备、智能手持终端、移动执法仪等。平台具有强大的数据接入、处理及分发能力&#xff0c;可在复杂的网络环境中&#xff0c…

精通自动化,Pytest自动化测试框架-fixture用例的前后置(实现)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 测试用例实现前后…

软件项目验收测试报告-软件项目验收流程

目录 一、什么是项目验收&#xff1f; 二、软件项目验收材料的准备 三、软件项目验收&#xff0c;按照验收的流程&#xff0c;可分为验收准备、初步验收、最终验收和项目交接四个部分。 对甲方而言&#xff0c;项目验收是正式接受项目成果&#xff0c;将项目从建设转为运营。…

视频增强技术-去噪

本文介绍了关于视频增强技术的相关方法包括传统方法和基于深度学习的方法&#xff0c;并给出了他们的对比实验结果&#xff0c;最后对它们简单的做了总结&#xff0c;文中有一些图片和总结来自于网上其他博主的文章&#xff0c;已在文中标记并给出了相关的原文链接&#xff0c;…

JAVA基础-集合(List与Map)

目录 引言 一&#xff0c;Collection集合 1.1,List接口 1.1.1&#xff0c;ArrayList 1.1.1.1&#xff0c;ArrayList的add&#xff08;&#xff09;添加方法 1.1.1.2&#xff0c;ArrayList的remove&#xff08;&#xff09;删除方法 1.1.1.3&#xff0c;ArrayList的contai…

机器学习之主成分分析(Principal Component Analysis)

1 主成分分析介绍 1.1 什么是主成分分析 主成分分析&#xff08;Principal Component Analysis&#xff09;简称PCA&#xff0c;是一个非监督学习的机器学习算法&#xff0c;主要用于数据的降维&#xff0c;对于高维数据&#xff0c;通过降维&#xff0c;可以发现更便于人类理…

(css)自定义el-dialog对话框添加背景图片

(css)自定义el-dialog对话框添加背景图片 效果&#xff1a; // 文件管理对话框 /deep/ .el-dialog {background: transparent;background-image: url("../assets/image/file-upload-background.png");background-size: 100% 100%; } // 头部 /deep/ .el-dialog__titl…

2024考研408-操作系统 第五章-输入输出IO管理 学习笔记

文章目录 一、I/O管理概述1.1、I/O设备的概念与分类1.1.1、什么是I/O设备&#xff1f;1.1.2、I/O设备的分类&#xff1a;按照使用特性1.1.2、I/O设备的分类&#xff1a;按传输速率分类1.1.3、I/O设备的分类&#xff1a;按照信息交换的单位分类知识点回顾与重要考点 1.2、I/O控制…

【Linux】udp客户端windows版以及Tcp服务器的实现

windows版客户端更适合大多数人~ 文章目录 一. udp客户端windows版二.Tcp服务器的实现总结 一、udp客户端windows版 首先我们将上一篇文章中实现的udp大型聊天室的代码进行修改&#xff0c;注意我们只修改服务端代码将代码修改的很简单就好&#xff0c;因为我们只是做一个如何…

spring-事务

spring-事务 事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列&#xff0c;这些操作要么全部执行,要么全部不执行&#xff0c;是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成&#xff0c;它具有ACID特性。 为了在spring中…

UE特效案例 —— 骷髅爆点

一&#xff0c;环境配置 创建默认地形Landscape&#xff0c;如给地形上材质需确定比例&#xff1b;添加环境主光源DirectionalLight&#xff0c;设置相应的强度和颜色&#xff1b;添加天光反射SkyLight&#xff0c;用于天空反射&#xff1b;添加指数级高度雾ExponentialHeightF…

C++笔记之循环引用与环状引用

C笔记之循环引用与环状引用 code review! 文章目录 C笔记之循环引用与环状引用1.C循环引用和环状引用描述的是同一种现象吗?2.环状引用3.环状引用现象举例——常见环状引用4.解决环状引用——使用前向声明5.环状引用现象举例——使用对象本身可能造成环状引用 1.C循环引用和…

MySQL_4

目录 一、日志 1、错误日志 2、二进制日志 2.1 介绍 2.2 格式 2.3 删除 3、查询日志 4、慢查询日志 二、主从复制 1、概述 2、原理 3、搭建 三、分库分表 1、介绍 1.1背景 1.2拆分策略 1.3垂直拆分 1.4水平拆分 1.5实现技术 2、Mycat概述 2.1 介绍 2.2 安装 2.3…

每日一题2023.7.22|链表的基本操作

链表的基本操作 题目描述 考察链表的基本操作 输入 输入数据只有一组&#xff0c;第一行有n1个整数&#xff0c;第一个整数是这行余下的整数数目n&#xff0c;后面是n个整数。这一行整数用来初始化列表的&#xff0c;并且输入的顺序与列表中的顺序相反&#xff0c;也就是说如果…

htmlCSS-----浮动

目录 前言&#xff1a; 浮动 1.浮动的效果 2.浮动的特点 3.浮动的写法 4.浮动的原理 5.浮动的作用 6.案例 7.浮动的缺陷与解决方式 浮动问题 解决方式 8.补充说明 前言&#xff1a; 浮动是html里面重要的一部分&#xff0c;前面我们学习了三种元素的类型&#xff08;…

element中table的表格更新数据之后保留原来的勾选状态

reserve-selection: 仅对 typeselection 的列有效&#xff0c;类型为 Boolean&#xff0c;为 true 则会在数据更新之后保留之前选中的数据&#xff08;需指定 row-key&#xff09; <el-table ref"table" :data"DataList" :row-key"rowKey"&g…

使用rknn-toolkit2把YOLOV5部署到OK3588上

使用rknn-toolkit2把YOLOV5部署到OK3588上 虚拟环境搭建软件包安装在PC机上运行yolov5目标检测 虚拟环境搭建 首先在PC的ubuntu系统安装虚拟环境&#xff1a; 我的服务器是ubuntu18.04版本&#xff0c;所以安装python3.6 conda create -n ok3588 python3.6 需要键盘输入y&…

【博客681】k8s list机制与resourceVersion语义

k8s list机制与resourceVersion语义 K8s 架构&#xff1a;环形层次视图 对于 K8s 集群&#xff0c;从内到外的几个组件和功能&#xff1a; etcd&#xff1a;持久化 KV 存储&#xff0c;集群资源&#xff08;pods/services/networkpolicies/…&#xff09;的唯一的权威数据&…

实例023 建立字体形状窗体

实例说明 大家都见过不规则形状的窗体吧&#xff0c;那么如何制作一个文字形的窗体呢&#xff1f;文字形窗体一般应用在屏幕提示中&#xff0c;如收款机屏幕等。运行本例&#xff0c;效果如图1.23所示。 技术要点 以前&#xff0c;创建字体形窗体是一个既费时又费人力的过程&…