并发编程 synchronized (二) 两种锁

并发编程-synchronized解决原子性问题 当多个线程并发访问某个Java对象(Object)时,无论系统如何调度这些线程,也不论这些线程如何交替操作,这个对象都能表现出一致的、正确的行为,那么对这个对象的操作是线程安全的。如果这个对象表现出不一致的、错误的行为,那么对这个对象的操作不是线程安全的,发生了线程的安全问题。//示例1@Override// 同步代码块形式——锁为this,两个线程使用的锁是一样的,线程1必须要等到线程0释放了该锁后,才能执行。 阅读详情

目录

对象锁

定义

对象锁例子

在普通方法上加锁(相同对象调用相同方法)

对当前对象加锁(相同对象调用相同方法)

不同对象调用相同方法 && 相同对象调用不同方法

类锁

定义

类锁例子

在静态方法上加锁(不同对象调用相同方法)

​

对当前类加锁(不同对象调用相同方法)

不同对象调用不同方法

线程八锁

 第一锁

第二锁

第三锁(难点)

第四锁

第五锁(难点)

第六锁

第七锁

第八锁


对象锁

定义

形如:

synchronized void method(){ // 在普通成员方法上加锁
    // 临界区
}

void method(){
    synchronized(this){ // 锁住当前对象
        // 临界区
    }
}

两种方式的临界区,对于同一个对象是等效的

对象锁例子

在普通方法上加锁(相同对象调用相同方法)

package com.juc.ppy.synchronize;

import lombok.extern.slf4j.Slf4j;

@Slf4j(topic = "c.MethodSynchronized")
public class MethodSynchronized {
    public MethodSynchronized(){ // 每次创建新对象,都打印出该对象的 hash 码
        log.debug("创建了 MethodSynchronized 新对象 {}", this.hashCode());
    }

    public synchronized void getTime1(){ // 在普通成员方法上加锁
        try{
            log.debug("在普通方法加锁");
            Thread.sleep(2000); // sleep() 不会释放锁,用来证明锁起作用了
        }catch (Exception e){
            e.printStackTrace();
        }
        log.debug("结束");
    }
}

class Test3{
    public static void main(String[] args) throws InterruptedException {
        MethodSynchronized ms = new MethodSynchronized();

        Thread t1 = new Thread(() -> { // 线程 1 调用 getTime1()
            ms.getTime1();
        }, "t1");

        Thread t2 = new Thread(() -> { // 线程 2 调用 getTime1()
            ms.getTime1();
        }, "t2");

        t1.start();
        t2.start();
        t1.join();
        t2.join();
    }
}

① 第 2 秒创建出对象 ms

② 紧接着线程 t1 获取到锁,开始执行;第 4 秒结束,释放锁

③  线程 t2 获取到锁,开始执行;第 6 秒结束

综上:t1、t2 共用 ms 这一把锁

对当前对象加锁(相同对象调用相同方法)

@Slf4j(topic = "c.MethodSynchronized")
public class MethodSynchronized {
    public MethodSynchronized(){ // 每次创建新对象,都打印出该对象的 hash 码
        log.debug("创建了 MethodSynchronized 新对象 {}", this.hashCode());
    }

    public void getTime2(){
        synchronized (this){ // 在当前对象上加锁
            try{
                log.debug("synchronized (this)");
                Thread.sleep(2000);
            }catch (Exception e){
                e.printStackTrace();
            }
            log.debug("结束");
        }
    }
}

class Test4{
    public static void main(String[] args) throws InterruptedException {
        MethodSynchronized ms = new MethodSynchronized();

        Thread t1 = new Thread(() -> {
            ms.getTime2();
        }, "t1");

        Thread t2 = new Thread(() -> {
            ms.getTime2();
        }, "t2");

        t1.start();
        t2.start();
        t1.join();
        t2.join();
    }
}

情况与上面一样,说明这两种加锁方式是等效的 

不同对象调用相同方法 && 相同对象调用不同方法

@Slf4j(topic = "c.MethodSynchronized")
public class MethodSynchronized {
    public MethodSynchronized(){ // 每次创建新对象,都打印出该对象的 hash 码
        log.debug("创建了 MethodSynchronized 新对象 {}", this.hashCode());
    }

    public void method(){
        synchronized (this){ // 在当前对象上加锁
            try{
                log.debug("先芜湖~");
                Thread.sleep(2000);
            }catch (Exception e){
                e.printStackTrace();
            }
            log.debug("再起飞!");
        }
    }
}

class Test6{
    public static void main(String[] args) throws InterruptedException {
        MethodSynchronized ms1 = new MethodSynchronized();
        MethodSynchronized ms2 = new MethodSynchronized();

        Thread t1 = new Thread(() -> {
            ms1.method();
        }, "t1");

        Thread t2 = new Thread(() -> {
            ms2.method();
        }, "t2");

        t1.start();
        t2.start();
        t1.join();
        t2.join();
    }
}

① 创建了 ms1、ms2 两个对象

② 第 59 秒 t1、t2 几乎同时执行

③ 第 1 秒 t1、t3 几乎同时结束

综上:锁没起作用

@Slf4j(topic = "c.MethodSynchronized")
public class MethodSynchronized {
    public MethodSynchronized(){ // 每次创建新对象,都打印出该对象的 hash 码
        log.debug("创建了 MethodSynchronized 新对象 {}", this.hashCode());
    }

    public synchronized void getTime1(){ // 在普通成员方法上加锁
        try{
            log.debug("在普通方法加锁");
            Thread.sleep(2000); // sleep() 不会释放锁,用来证明锁起作用了
        }catch (Exception e){
            e.printStackTrace();
        }
        log.debug("结束");
    }

    public void getTime2(){
        synchronized (this){ // 在当前对象上加锁
            try{
                log.debug("synchronized (this)");
                Thread.sleep(2000);
            }catch (Exception e){
                e.printStackTrace();
            }
            log.debug("结束");
        }
    }
}

class Test7{
    public static void main(String[] args) throws InterruptedException {
        MethodSynchronized ms = new MethodSynchronized();

        Thread t1 = new Thread(() -> { // t1 调用方法 1
            ms.getTime1();
        }, "t1");

        Thread t2 = new Thread(() -> { // t2 调用方法 2
            ms.getTime2();
        }, "t2");

        t1.start();
        t2.start();
        t1.join();
        t2.join();
    }
}

总结:同一个对象属于同一把锁

① 不同对象调用相同方法,锁不起作用;是因为 ms1、ms2 相当于两把锁,分别被 t1、t2 获取;锁不同,临界区就不一样,它们相互之间是不影响的,各执行各的

② 相同对象调用不同方法,锁起作用;对象相同,锁就相同,临界区就相同

类锁

定义

形如:

static synchronized void method(){ // 在静态成员方法上加锁
    // 临界区
}

void method(){
    synchronized(类名.class){ // 对当前类加锁
        // 临界区
    }
}

两种方式的临界区,对于同一个类是等效的

类锁例子

在静态方法上加锁(不同对象调用相同方法)

@Slf4j(topic = "c.ClassSynchronized")
public class ClassSynchronized {
    public ClassSynchronized(){ // 每次创建新对象,都打印出该对象的 hash 码
        log.debug("创建了 ClassSynchronized 新对象 {}", this.hashCode());
    }

    private static synchronized void getTime0(){ // 在静态成员方法上加锁
        try{
            log.debug("在静态方法加锁");
            Thread.sleep(2000); // sleep() 不会释放锁,用来证明锁起作用了
        }catch (Exception e){
            e.printStackTrace();
        }
        log.debug("结束");
    }

    public void getTime(){ // 最终调用的方法;用来证明:即使是不同对象,锁也是一样的
        getTime0();
    }
}

class Test0{
    public static void main(String[] args) throws InterruptedException {
        ClassSynchronized cs1 = new ClassSynchronized(); // 创建对象 1
        ClassSynchronized cs2 = new ClassSynchronized(); // 创建对象 2

        Thread t1 = new Thread(() -> {
            cs1.getTime(); // 线程 1 中调用对象 1 的普通方法
        }, "t1");

        Thread t2 = new Thread(() -> {
            cs2.getTime();
        }, "t2"); // 线程 2 中调用对象 2 的普通方法

        t1.start();
        t2.start();
        t1.join();
        t2.join();
    }
}

① 第 36 秒创建出对象 cs1、cs2

② 紧接着线程 t1 获取到锁,开始执行;第 38 秒结束,释放锁

③  线程 t2 获取到锁,开始执行;第 40 秒结束

综上:虽然 cs1、cs2 是两个不同对象,但是属于同一个类,同一个临界区,t1、t2 它们共用一把类锁

对当前类加锁(不同对象调用相同方法)

@Slf4j(topic = "c.ClassSynchronized")
public class ClassSynchronized {
    public void getTime1(){
        synchronized (ClassSynchronized.class){ // 直接锁住当前类
            try{
                log.debug("synchronized (ClassSynchronized.class)");
                Thread.sleep(2000);
            }catch (Exception e){
                e.printStackTrace();
            }
            log.debug("结束");
        }
    }
}

class Test1{
    public static void main(String[] args) throws InterruptedException {
        ClassSynchronized cs1 = new ClassSynchronized();
        ClassSynchronized cs2 = new ClassSynchronized();

        Thread t1 = new Thread(() -> {
            cs1.getTime1();
        }, "t1");

        Thread t2 = new Thread(() -> {
            cs2.getTime1();
        }, "t2");

        t1.start();
        t2.start();
        t1.join();
        t2.join();
    }
}

情况与上面一样,说明这两种加锁方式是等效的 

不同对象调用不同方法

@Slf4j(topic = "c.ClassSynchronized")
public class ClassSynchronized {
    public ClassSynchronized(){ // 每次创建新对象,都打印出该对象的 hash 码
        log.debug("创建了 ClassSynchronized 新对象 {}", this.hashCode());
    }

    public void method1(){ // 方法 1 芜湖
        synchronized (ClassSynchronized.class){ // 直接锁住当前类
            try{
                log.debug("芜湖~");
                Thread.sleep(2000);
            }catch (Exception e){
                e.printStackTrace();
            }
            log.debug("芜湖~");
        }
    }

    public void method2(){ // 方法 2 起飞
        synchronized (ClassSynchronized.class){ // 直接锁住当前类
            try{
                log.debug("起飞!");
                Thread.sleep(2000);
            }catch (Exception e){
                e.printStackTrace();
            }
            log.debug("起飞!");
        }
    }
}

class Test2{
    public static void main(String[] args) throws InterruptedException {
        ClassSynchronized cs1 = new ClassSynchronized();
        ClassSynchronized cs2 = new ClassSynchronized();

        Thread t1 = new Thread(() -> {
            cs1.method1(); // cs1 调用 芜湖
        }, "t1");

        Thread t2 = new Thread(() -> {
            cs2.method2(); // cs2 调用 起飞
        }, "t2");

        t1.start();
        t2.start();
        t1.join();
        t2.join();
    }
}

不同对象,调用不同方法,锁依旧起作用;足以说明对于同一个类都属于同一把锁 

线程八锁

 第一锁

@Slf4j(topic = "c.Number")
class Number{
    public synchronized void a() {
        log.debug("1");
    }
    public synchronized void b() {
        log.debug("2");
    }
}
public static void main(String[] args) {
    Number n1 = new Number();
    new Thread(()->{ n1.a(); }).start();
    new Thread(()->{ n1.b(); }).start();
}

结果:12 或 21

第二锁

@Slf4j(topic = "c.Number")
class Number{
    public synchronized void a() {
        sleep(1);
        log.debug("1");
    }
    public synchronized void b() {
        log.debug("2");
    }
}
public static void main(String[] args) {
    Number n1 = new Number();
    new Thread(()->{ n1.a(); }).start();
    new Thread(()->{ n1.b(); }).start();
}

结果:1s 后 12 或 2 过 1s 后 1

第三锁(难点)

class Number{
    public synchronized void a() {
        sleep(1);
        log.debug("1");
    }
    public synchronized void b() {
        log.debug("2");
    }
    public void c() {
        log.debug("3");
    }
}
public static void main(String[] args) {
    Number n1 = new Number();
    new Thread(()->{ n1.a(); }).start();
    new Thread(()->{ n1.b(); }).start();
    new Thread(()->{ n1.c(); }).start();
}

结果:3 过 1s 后 12 或 32 过 1s 后 1 或 23 过 1s 后 1

说明:方法 c 没有加锁;sleep 会释放时间片,就算第二个线程获得了时间片,由于没有锁进入阻塞;所以不可能出现 "13" 这种结果

第四锁

@Slf4j(topic = "c.Number")
class Number{
    public synchronized void a() {
        sleep(1);
        log.debug("1");
    }
    public synchronized void b() {
        log.debug("2");
    }
}
public static void main(String[] args) {
    Number n1 = new Number();
    Number n2 = new Number();
    new Thread(()->{ n1.a(); }).start();
    new Thread(()->{ n2.b(); }).start();
}

结果:2 1s 后 1

第五锁(难点)

@Slf4j(topic = "c.Number")
class Number{
    public static synchronized void a() {
        sleep(1);
        log.debug("1");
    }
    public synchronized void b() {
        log.debug("2");
    }
}
public static void main(String[] args) {
    Number n1 = new Number();
    new Thread(()->{ n1.a(); }).start();
    new Thread(()->{ n1.b(); }).start();
}

结果:2 1s 后 1

说明:a 加的是类锁,b 加的是对象锁;相当于不同锁,互不影响

第六锁

@Slf4j(topic = "c.Number")
class Number{
    public static synchronized void a() {
        sleep(1);
        log.debug("1");
    }
    public static synchronized void b() {
        log.debug("2");
    }
}
public static void main(String[] args) {
    Number n1 = new Number();
    new Thread(()->{ n1.a(); }).start();
    new Thread(()->{ n1.b(); }).start();
}

结果:2 1s 后 1 或 1s 后 12

第七锁

@Slf4j(topic = "c.Number")
class Number{
    public static synchronized void a() {
        sleep(1);
        log.debug("1");
    }
    public synchronized void b() {
        log.debug("2");
    }
}
public static void main(String[] args) {
    Number n1 = new Number();
    Number n2 = new Number();
    new Thread(()->{ n1.a(); }).start();
    new Thread(()->{ n2.b(); }).start();
}

结果:2 1s 后 1 

第八锁

@Slf4j(topic = "c.Number")
class Number{
    public static synchronized void a() {
        sleep(1);
        log.debug("1");
    }
    public static synchronized void b() {
        log.debug("2");
    }
}
public static void main(String[] args) {
    Number n1 = new Number();
    Number n2 = new Number();
    new Thread(()->{ n1.a(); }).start();
    new Thread(()->{ n2.b(); }).start();
}

结果:2 1s 后 1 或 1s 后 12

并发编程之synchronized干货详解 synchronized在偏向锁升级到轻量锁时,会涉及到偏向锁撤销,需要等到一个安全点,stw,才可以撤销,并发偏向锁撤销比较消耗资源 在程序启动时,偏向锁有一个延迟开启的操作,因为项目启动时,ClassLoader会加载.class文件,这里会涉及到synchronized操作, 为了避免启动时,涉及到偏向锁撤销,导致启动效率变慢,所以程序启动时,默认不是开启偏向锁的。线程基于CAS修改数据的方式:先获取主内存数据,在修改之前,先比较数据是否一致,如果一致修改主内存数据,如果不一致,放弃这次修改。 阅读详情

相关推荐

MobaXterm详细使用教程

当然MobaXterm的功能远不止这些,但这些是最基本,最常用的,因此先拿出来讲。点击确定后,输入密码(输入密码时并不会显示,只管输入后按确定即可,第一次登陆成功后会提示保存密码,一般选择同意),就可以连接上虚拟机了。(2) 我们可以直接apt-get安装vim等常用功能(或者官网下载插件),实现在windows下模拟linux环境,这样就可以使用vi命令准备INCAR文件,也可以使用Gnuplot进行绘图。支持 Unix 命令(bash,ls,cat,sed,grep,awk,rsync,…

博客 4万+

synchronized详解

前言     一直想写自己的博客,真正动手了才知道难啊。但没办法,博客总要写的,今天就从Java中最常用的synchronized开始吧!我想从三个方面写synchronized: 用法。 原理。 优化。 第一次写博客,可能会有一些错误,欢迎指出。 用法 synchronized的用法主要有三种: 使用普通同步方法中。 默认锁的是当前对象。即this。...

laijinxiang0108的博客 457

AI辅助专利撰写实战:30分钟高效产出发明专利初稿

在技术创新的浪潮中,专利撰写常常是开发者将创意转化为知识产权保护壁垒的关键一步,但这个过程往往耗时费力,需要兼顾技术深度与法律文书规范。近期,借助AI辅助工具来提升专利撰写效率已成为一个热门探索方向。本文将围绕如何利用AI工具,在30分钟内高效完成一篇具备授权潜力的发明专利初稿,进行一场从0到1的实战演练。无论你是独立开发者、初创团队的技术负责人,还是希望保护自己研究成果的学生,这套方法都能帮助你快速梳理技术方案,形成结构严谨、逻辑清晰的专利申请文档。 1. 背景与核心概念:AI辅助专利撰写的价值与边界 在

weixin_34253126的博客 493

Java中Synchronized的用法(简单介绍)

简单介绍 synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:   1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;   2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;   3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;   4. 修改一个类,其作用的范围是synchronized后面括号括起来的...

NeiHan2020的博客 6561

OnlyOffice Docker部署踩坑实录:解决Nginx反向代理导致的editor.bin下载失败

本文详细解析了在Docker中部署OnlyOffice时,因Nginx反向代理配置不当导致editor.bin下载失败的常见问题。通过分析问题根源,提供了从Nginx代理配置、Docker网络设置到OnlyOffice容器内部调整的完整解决方案,并分享了实战调试技巧与性能优化建议,帮助用户彻底解决这一部署难题。

wine的专栏 523

ubuntu18.04 显卡驱动问题 造成屏幕分辨变大 NVIDIA-SMI has failed because it couldn't communicate with ....等问题

问题1:装好了显卡驱动,cudnn,tensorflow等没问题,一直可以用。但是突然有一天不行了,终端输入:nvidia-smi 显示:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed...

梦萦飞--CV/DL/ML 2248

线程用synchronized产生死锁的问题及解决

线程用synchronized产生死锁的问题及解决

wycyiyang的博客 1584

Python爬虫实战:逆向解析央视频加密参数(附完整代码)

本文详细解析了央视频加密体系的技术实现,通过Python逆向工程实战演示如何解密动态密钥、AES加密和自定义哈希算法等核心组件。文章提供完整代码示例,涵盖GUID生成、参数构造和异步请求处理,帮助开发者掌握现代视频平台的反爬机制破解方法。

weixin_42532473的博客 1129

国密GmSSL v2版本命令行方式生成国密sm2私钥、公钥、签名和验证签名

GmSSL是国密算法的工具库(主要包含SM2、SM3、SM4和国密SSL证书生成等功能),项目本身是OpenSSL的分支,但是截至文章发布为止,OpenSSL主分支的国密算法并不完善,目前并不支持签名和解签,所以国密算法这块还是需要使用GmSSL工具库。网上现在并没有v2版本的GmSSL可用的命令行文章,本章用于记录这些命令。本文原创自csdn博客,其他网站看到这篇文章都是盗,版,爬。虫。网站,支持原创,远离盗版。

eguid音视频方向博客,分享经过实践检验的硬核音视频技术。FFmpeg、openCV和JavaCV音视频和图像处理系列教程发布十周年,众多开发者的严格验证。欢迎关注,一起交流探索学习最新音视频和图像处理技术 4604

2025华为杯第二十二届中国研究生数学建模竞赛A题:通用神经网络处理器下的核内调度问题 - 完整解题分析+完整MATLAB源码!

🎓 本文收录于 《滚雪球学数学建模》专栏,本专栏专注于从零基础出发,带你循序渐进掌握数学建模的核心方法与思维路径。通过“滚雪球式”学习法,从最简单的生活化案例到经典建模工具,再到省赛、国赛真题实战演练,逐步积累知识与技能,帮助你搭建完整的建模体系。无论你是刚接触建模的新生,还是希望提升科研与竞赛能力的学者与工程师,本专栏都将为你提供一条清晰、高效、可实操的建模成长路线,助力你快速进阶,突破难点,迈向数学建模竞赛与实际应用的更高峰 🚀!

**My Coding Family** 2052

Java多线程基础 05.synchronized关键字

synchronized关键字   Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。 synchronized 方法   如果声明了一个方法时,在前面加上关键字synchronized,那么这个方法就每次只能由一个线程运行。这种方法称为synchronized方法,有时也称为同步方法。 public synchronized void run(){ } synchronized 代码块   如果只是想让方法中

努力推石头的西西弗斯 438

软硬件融合加速技术系列文章

目录 文章目录目录计算机组成原理Linux 操作系统原理处理器进程管理内存管理I/O 系统文件系统网络协议栈资源管理设备管理GPUFPGASmartNIC/DPU 计算机组成原理 《计算机组成原理 — 冯诺依曼体系结构》 《计算机组成原理 — 基本硬件设备》 《计算机组成原理 — CPU 中央处理器》 《计算机组成原理 — 指令系统》 《计算机组成原理 — 总线系统》 《计算机组成原理 — 存储系统》 《计算机组成原理 — 输入输出系统 — 存储控制器接口类型》 《计算机组成原理 — 服务器》 《计算机组成

烟云的计算 6806

【Java并发编程】描述常见的锁策略、CAS在Java中的实现以及 Synchronized 的加锁原理

描述常见的锁策略、描述CAS的原理以及在Java中有哪些实现、描述Java中 synchronized的基本特点和加锁原理。

yican2580的博客 2079

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Synchronized底层核心原理

本篇文章是关于并发编程中Synchronized锁的底层核心原理知识记录,由于篇幅原因,下篇文章将介绍各种锁的优化原理。

小威的博客 8693

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【并发编程系列2】synchronized锁升级原理分析(偏向锁-轻量级锁-重量级锁)

synchronized原理分析初识 synchronizedsynchronized 用法锁是如何存储的synchronized 锁升级偏向锁偏向锁的获取偏向锁的撤销偏向锁及撤销流程图偏向锁注意事项轻量级锁轻量级锁加锁轻量级锁解锁轻量级锁及膨胀流程图自旋锁自适应自旋重量级锁锁的优缺点对比 初识 synchronized 在并发编程中,synchronized对我们来说并不陌生,我们都知道,当多个线程并行的情况下,程序是不安全的,这个不安全主要发生在共享变量的不安全,我们通过一个例子来说明: package

zwx900102的博客 8909

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java 并发编程中的 synchronized 锁详解

是 Java 中实现线程安全的一个重要工具,它能够有效地防止多个线程同时访问共享资源导致的数据不一致问题。然而,也存在性能开销和死锁风险,因此在实际开发中,需要合理设计和使用。对于简单的线程安全需求,可以直接使用。对于复杂的并发场景,应该考虑使用更灵活的工具,如Atomic等。

萌萌白白的博客 825

Java并发编程——Synchronized锁升级机制

Synchronized锁升级流程

BUPTZhanggg的博客 2001

Java中synchronized实现类锁的两种方式及原理解析

简介 上一篇文章《Java中synchronized实现对象锁的两种方式及原理解析》中,介绍了方法锁的两种实现方式及Synchronized的底层原理,本文将讲解synchronized的类锁的两种实现方式。 一.类锁的定义 什么是类锁 类锁指synchronize修饰的静态方法或指定锁为class对象。 类锁来自何处? 不同的线程,访问使用类锁的方法的时候,他们获取到的“锁”,其实是Class对象。因为同一个类中有且只有一个Class对象,但同一个类中可以有很多个其他对象。此时,就出现了同一个类中多个对

五道口 8698

Synchronized锁的使用

本篇文章是关于并发编程中Synchronized锁的用法知识记录,由于篇幅原因,核心原理知识下篇记录

小威的博客 4234

synchronized的四种锁状态

在 Java 中,`synchronized` 关键字是一个非常重要的同步机制,用于确保在多线程环境下,同一时刻只有一个线程可以执行某个方法或代码块。本文将详细介绍 `synchronized` 关键字的使用、锁的类型、锁的升级过程以及锁的实现原理。

专注Java和MySQL领域知识分享 1983

java并发编程—synchronized 的基本用法和锁升级机制详解

的锁升级机制是 Java 并发编程中的重要优化,它通过偏向锁轻量级锁和重量级锁的逐步升级,在保证线程安全的同时,尽量减少锁带来的性能开销。开发者可以根据具体的并发场景,理解锁升级的原理,从而编写出更高效的并发程序。

Future_yzx的博客 3万+

synchronized锁,ReentrantLock 锁

(如程序计数器、栈指针、通用寄存器值等)到内存(通常是内核栈),再加载内核态的上下文。这个过程涉及多次内存读写(内存速度比 CPU 寄存器慢 100 倍以上),且需要严格保证操作的原子性(避免数据错乱),硬件层面的指令执行成本很高。切换时,CPU 必须保存当前用户态的。

chaodddddd的博客 1481

并发编程锁之synchronized(二)

锁synchronized并发编程中数据同步需要依赖锁进行控制,上篇博文通过ReentrantLock源码分析也对Lock实现锁机制的大致原理有了一个了解,Lock主要是通过编码的方式实现锁,其核心就是:CAS+循环,CAS原子操作需要依赖底层硬件层特殊的CPU指令。这节我们来看下Java中另一种非常常见的实现同步的方式:synchronized。synchronized主要通过底层JVM进行实现...

欢迎来到技术宅的博客 1251

《我要进大厂》系列之ReentrantLock与synchronized两种锁的区别

在大厂面试中,特别是第一轮技术面试中,锁是一个非常高频的主题,在JDK中主要提供了两种方式:JUC(JAVA并发框架)中的ReentrantLock与synchronized关键字。 那这两种有何区别呢?在实际工作中又如何选取呢? ReentrantLock 实现 synchronized 的语义,提供多线程的同步阻塞语义,即我们通常意义上的同步锁,但 ReentrantLock 的使用更加灵活,提供了synchronized关键字不具备的功能特性。 1、可重入性 ReentrantLock 与 synch

中间件兴趣圈 4310

并发编程中锁Synchronized和ReentrantLock,CAS,AQS理解

并发编程中锁Synchronized和ReentrantLock,CAS,AQS理解

qq_62097431的博客 1243
上一篇: 并发编程 synchronized (一) 初识
下一篇: 并发编程 synchronized (三) 变量是否线程安全
皮皮杨233
博客等级 码龄7年 42粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值