Java简单锁机制,synchronized死锁并解决

Java线程锁全面解析:从synchronized到StampedLock,一篇搞定所有锁机制 本文全面解析Java中的多线程锁机制。首先介绍基础的synchronized关键字,分析其三种使用方式、特性(可重入性、非公平锁等)和局限性(无法中断、单一条件等)。然后详细讲解ReentrantLock显示锁,包括其核心优势:可中断获取锁、支持超时、公平锁实现和多条件变量。接着探讨读写锁ReentrantReadWriteLock及其在读写分离场景中的应用,包括锁降级技术。最后介绍Java 8新增的StampedLock,重点分析其三种访问模式(写锁、悲观读锁和乐观读)及性能优势。全文通过代码示例展示各种 阅读详情

下面例子有一定概率deadLock

import com.sun.org.apache.regexp.internal.RE;

/**
 * Created by butter on 16/11/15.
 */

class Resource{
    private String name;
    private int resource;

    public Resource(String name, int resource) {
        this.name = name;
        this.resource = resource;
    }
    synchronized void doSome(){
        System.out.println("doing some thing");
        resource++;
    }
    synchronized void cooperate(Resource resource){
        System.out.println("cooperating");
        resource.doSome();
    }
}


/**
 *
 * 两个Resource对象 r1, r2
 * 两个线程t1, t2
 * t1调用cooperate(r2)时获取r1的锁,如果此时此刻t2正在调用cooperate(r1)将获取r2的锁
 * 这时,t1.cooperate(r2)执行r2.doSome(),将申请获取r2的锁,r2锁被t2获取,所以等待
 * 并且,t2.cooperate(r1)执行r1.doSome(),将申请获取r1的锁,r1的锁被t1获取,继续等待,
 *
 * 结果就是t1 等 t2 的锁  t2 等 t1 的锁,互相等待对方的锁,造成死锁
 */

public class Demo_deadLock {
    public static void main(String[] args) {
        Resource r1 = new Resource("1", 1);
        Resource r2 = new Resource("2", 2);

//      循环次数多一些,为了得到上述情况
        Thread thread1 = new Thread(()->{
            for (int i = 0; i < 100; i++) {
                r1.doSome();
                r1.cooperate(r2);
            }

        });
        System.out.println("t1 over");
        Thread thread2 = new Thread(()->{
            for (int i = 0; i < 100; i++) {
                r2.doSome();
                r2.cooperate(r1);
            }

        });
        thread1.start();
        thread2.start();
        System.out.println("t2 over");

    }
}

解决方案:

import java.util.concurrent.locks.ReentrantLock;

/**
 * Created by butter on 16-11-17.
 */
/**
 * 
 * 每次线程尝试获取lock,获取不到,释放已有lock,解决deadlock
 * 
 */


class Resource1{

    private String name;
    private int resource;
    private ReentrantLock lock = new ReentrantLock(); //Lock接口

    public Resource1(String name, int resource) {
        this.name = name;
        this.resource = resource;
    }
    void doSome(){

        System.out.println(Thread.currentThread().getName() + " doing some thing: " + name+ " " + resource);
        resource++;
    }
    void cooperate(Resource1 resource){
        while(true) {
            try {
                if (lockMeAnd(resource)) {
                    System.out.println(Thread.currentThread().getName() + "  r1 & r2 has been Locked");
                    System.out.println(Thread.currentThread().getName() + " cooperating");
                    resource.doSome();
                    break;
                } else {
                    System.out.println( Thread.currentThread().getName() +"       can't lock r1&r2");
                }
            }finally {
                unLockMeAnd(resource);
                System.out.println(Thread.currentThread().getName() + " r1 & r2 has been unLocked");
            }

        }
    }

    private boolean lockMeAnd(Resource1 res){
        /*尝试获取锁, 获取不到->不阻塞*/
        return this.lock.tryLock() && res.lock.tryLock();
    }
    private void unLockMeAnd(Resource1 res){
        if(this.lock.isHeldByCurrentThread()){
            this.lock.unlock();
        }
        if(res.lock.isHeldByCurrentThread()){
            res.lock.unlock();
        }
    }
}


public class Demo_noDeadLock {
    public static void main(String[] args) {
        Resource1 r1 = new Resource1("a", 1);
        Resource1 r2 = new Resource1("b", 2);

        Thread t1 = new Thread(()->{
            for (int i = 0; i < 10; i++) {
                r1.cooperate(r2);
            }
        });
        Thread t2 = new Thread(()->{
            for (int i = 0; i < 10; i++) {
                r2.cooperate(r1);
            }
        });
        t1.start();
        t2.start();
    }
}

Synchronized锁、公平锁、悲观锁乐观锁、死锁等 hpp作为文件名扩展名的一种约定,用于区分C++的头文件和C的头文件(通常使用.h作为文件名扩展名)。:当系统中的资源不足时,例如内存、文件句柄、网络连接等,进程(线程)可能会因为无法获取所需的资源而陷入死锁。当采用非公平锁,当1个线程请求获取同步状态,然后释放同步状态,所以在此刻该线程获取同步状态的概率就会变得很大,减少了线程切换的开销。:如果进程(线程)在获取资源时没有正确地管理和释放资源,或者资源的分配策略不合理,可能会导致资源的浪费和争夺,最终导致死锁。 阅读详情

相关推荐

从synchronized到ReentrantLock_Java锁机制的演进与选择

synchronized关键字简单易用,适合低竞争场景,但不具备中断和超时功能。ReentrantLock提供了更灵活的锁控制,支持中断、超时和公平锁,适用于复杂并发场景,但需要手动管理锁的获取和释放。选择时,应根据具体需求权衡 simplicity 和灵活性。

九天的专栏 1187

synchronized:解决死锁的问题[轉貼]

synchronized:解决死锁的问题[轉貼]最近对pv操作研究了一下,才发现原来java已经提供了内置的防死锁功能,不能不说它是很人性的了。下面就是整理的资料: 多线程的互斥与同步   临界资源问题   前面所提到的线程都是独立的,而且异步执行,也就是说每个线程都包含了运行时所需要的数据或方法,而不需要外部的资源或方法,也不必关心其它线程的状态或行为。但是经常有一些

冯立彬的博客 1万+

深度学习赋能胶囊内镜:AI如何实现胃肠道出血的自动检测与分割

在计算机视觉领域,图像分类与目标检测是处理医学影像分析的核心技术。其原理在于通过卷积神经网络(CNN)自动学习图像中的多层次特征表示,实现对特定目标的识别与定位。这项技术的价值在于能够将医生从海量、重复的阅片工作中解放出来,提升诊断效率与一致性,尤其在处理如胶囊内镜产生的数万张连续图像时优势显著。其应用场景广泛覆盖了医学影像的辅助诊断,例如在消化内科,对胃肠道出血的早期发现与精准定位具有重要临床意义。本文聚焦于利用深度学习模型,如U-Net和EfficientNet,构建一个能够从复杂多变的胶囊内镜图像中,

weixin_42533910的博客 382

synchronized常见锁策略

讲述了synchronized中常见的锁策略,包括乐观锁,悲观锁,轻量级锁,重量级锁,读写锁,公平锁,等等一系列锁的原理

a512512a的博客 1831

避坑指南:AUTOSAR FlashDriver操作DFlash模拟EEPROM时,你最容易忽略的5个细节

本文深入探讨了AUTOSAR FlashDriver在DFlash模拟EEPROM操作中最容易被忽视的五大细节问题,包括地址合法性检查、操作时序控制、并发访问冲突、电源稳定性管理和寿命管理。通过实际项目案例和工程化解决方案,帮助开发者避免常见陷阱,提升汽车电子控制单元(ECU)的可靠性和稳定性。

weixin_42741930的博客 247

汇编语言(第4版)王爽 课程设计2 详细实现(一、虚拟模式DOS运行篇)

由于虚拟模式的限制,我们编写的许多逻辑暂时不能被检验,而因为《汇编语言》编写时间较早,其所依赖的运行环境如今只能够依靠虚拟机来搭建。比如实模式DOS,搭建步骤比较繁琐,因此我将其它的部分放在下一篇文章中进行讲解。事实上,我们实现的程序属于《汇编语言》课程设计2中任务程序部分,其中的完整任务还涉及到将该任务程序安装到软盘等操作,这些也都需要在实模式下才能运行,所以统一放到下一篇文章进行实现。

m0_73327328的博客 2824

Java锁机制,synchronized和lock详解。

Java锁机制详解

记录开发日常笔记 7447

UNITY2022 Cardboard环境搭建

必须安装 Git,并且 git 可执行文件必须位于 PATH 环境变量中。考文档:https://developers.google.cn/cardboard/develop/unity/quickstart?转到 Assets/Samples/Google Cardboard//Hello Cardboard/Scenes/HelloCardboard 场景中。粘贴https://github.com/googlevr/cardboard-xr-plugin.git到文本输入字段中。

weixin_39510925的博客 1211

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

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

wycyiyang的博客 1584

RK3568平台(USB篇)USB Gadget 驱动

USB 设备驱动,按照设备端关联的 USB 控制器 是工作在 主模式 还是 从模式,分为 USB 设备主机侧驱动 (主模式),或者 USB 设备从机侧驱动 (从模式)。同时,工作在 主模式 的 USB 控制器,称为 USB 主机控制器 (UHC: USB Host Controller),工作在 从模式 的 USB 控制器,称为 USB 设备控制器 (UDC: USB Device Controller)。有的 USB 控制器,只能工作在 主模式 或 从模式 中的某一种;

weixin_49303682的博客 1439

YOLOv8【第十章:多任务扩展深度篇·第18节】不规则工业缺陷分割——针对划痕、裂纹的 Seg 模型调优!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 3982

synchronized、ReentrantLock死锁的产生以及解决(一)

synchronized、ReentrantLock死锁

yeluowan的博客 1466

Labview项目01:标准可配置序列测试框架

摘要:本文介绍了一个基于LabVIEW2020开发的通用测试框架系统。该系统采用模块化设计,包含主界面、调试界面、设置界面和登录界面。主功能包括:1)可配置测试序列,支持延时、预定值输出、随机值输出等操作;2)单步测试功能自主添加;3)界面支持测试序列编辑和权限管理。系统采用队列机制处理事件和测试流程,通过CSV文件存储测试序列,支持参数化配置。用户可自定义测试VI(A_.vi和N_.vi格式),并通过调试界面验证测试序列。最终测试结果在主界面显示,提供整体判断功能。该系统既可作为学习参考,也可用于实际测试

weixin_38637405的博客 1552

Java并发编程系列9 - 锁

【Java并发编程系列9】锁

开心博客 184

容器化部署指南——Docker/K8s环境下的OpenClaw实践(附Dockerfile)

通过本文的详细指导,你已经掌握了OpenClaw在Docker和Kubernetes环境中的容器化部署方法。从基础镜像构建到高级部署策略,从开发环境到生产环境,你现在已经具备了完整的容器化部署能力。 容器化技术为OpenClaw提供了灵活、可扩展、可移植的部署方案,能够满足不同规模和需求的应用场景。通过合理使用Docker和Kubernetes,你可以实现高效的部署管理和运维自动化。 在实际应用中,建议根据具体的业务需求选择合适的部署策略,并结合监控、日志、安全等最佳实践,确保系统的稳定性和可靠性。同时

博客 497

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

线程优先级;守护线程;线程同步(synchronized);死锁;Lock;管程法;线程池

线程优先级 优先级高,只是意味着获得调度的概率高,并不是一定首先被CPU调度 public class TestPriority { public static void main(String[] args) { System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority()); MyPriority myPriority = new

weixin_45964083的博客 216

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java多线程(4)---死锁和Synchronized加锁流程

本文讲解synchronized的详情,工作流程等,以及死锁的的概念,死锁的经典的场景、死锁的条件和讲解方法。

tq02的博客 1622

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java多线程之synchronized及死锁编写

java中锁很常见,尤其是在多线程的情况下,我们会经常使用到锁。面试中我们也会经常被问到如何编写一个死锁。 java提供synchronized关键字来提供锁机制,在多线程中为了使程序并行我们会常使用到锁,synchronized就是其中最简单的实现方式,首先我们来看一下synchronized最基本的用法: 首先我们新建Person类,其中包含如下代码:public class Person {

silk_bar的专栏 4088

Java 锁机制详解:别再靠 synchronized 混日子了!

不会锁,就别写多线程。”—— 某被死锁搞崩的程序员“锁不是银弹。锁得好不如并发结构设计得好。多线程代码可读性差,加锁要特别小心不滥用锁,不随便,容易锁住全世界最好的锁,是你根本不需要锁 —— 线程安全的结构或并发队列是更优解写多线程不怕慢,怕乱;锁机制学通了,Bug 就少一半!如果你觉得这篇文章对你有帮助,或者有任何想法、建议,欢迎在评论区留言交流!我是一个在代码世界里不断摸索的小码农,愿我们都能在成长的路上越走越远,越学越强!✍️ 作者:某个被流“治愈”过的 Java 老兵。

欢迎来到菜鸟不学编程的博客 900

[JavaEE]synchronized 与 死锁

当某个线程执行到 synchronized 所修饰的对象时 , 该线程对象会加锁(lock) , 其他线程如果执行到同一个对象的 synchronized 就会产生阻塞等待.

Node_Hao的博客 2848

Java锁机制,Synchronized详解

是Java提供的一种同步机制,用于控制多个线程对共享资源的访问。它确保同一时刻只有一个线程可以执行被修饰的方法或代码块。

横竖撇折点 1094

Java锁机制之synchronized

java中2种锁的实现原理区别: synchronized: 在软件层面依赖JVM,在jvm将class文件编译成字节码文件时添加monitorenter和monitorexit句柄来区分加锁代码块 Lock: 在硬件层面依赖特殊的CPU指令。 synchronized机制: 首先需要明确的一点是:Java多线程的锁都是基于对象的,Java中的每一个非空对象都可以作为一个锁。 synchronized关键字锁具体表现为:锁对象和锁对象的class类;每个类可以有很多实例对象,不同实例对象的对象锁互不干扰,但

wenhonglian的博客 3672

JAVA篇_线程锁synchronized、lock与死锁

在分布式开发中,锁是线程控制的重要途径。Java为此也提供了2种锁机制,synchronized和lock。 区别: 1、lock是一个接口,而synchronized是java的一个关键字。 2、synchronized在发生异常时会自动释放占有的锁,因此不会出现死锁;而lock发生异常时,不会主动释放占有的锁,必须手动来释放锁,可能引起死锁的发生,Java中每一个对象都可以作为锁,这是synchronized实现同步的基础: 3、Lock是显示锁(需要手动开关),synchronized始于隐式

qq_45878219的博客 4382

Java线程安全:synchronized锁机制详解

死锁指多个进程(或线程)在执行过程中,因争夺资源 ,导致各进程(或线程)都在等待其他进程(或线程)释放已占用的资源,从而相互等待,无法继续推进的一种僵持局面。线程B持有资源2,等待资源1,双方都不释放已持有的资源,就形成了死锁。synchronized(Object obj){ } 中加锁的对象(obj)是谁,对加锁中的内容是没有影响的,只要是对同一个对象加锁即可。总之:无论那种写法,synchronized()针对什么对象加锁不重要,最重要的是,两个线程是否针对一个对象加锁。任意打破一点即可避免死锁。

2401_89176842的博客 978

【Java & 多线程】synchronized 和 死锁问题

死锁是多线程编程中的一种常见问题, 它发生在两个或多个线程永久性地阻塞, 每个线程等待其他线程释放锁, 但这些锁又被其他线程持有, 导致没有线程能够继续执行, 形成了一个闭环的等待的关系。通过理解死锁的成因,我们可以采取相应的策略来避免或解决死锁。在设计多线程程序时,合理地管理锁和资源,遵循锁的使用规范,可以大大降低死锁发生的可能性。通过以上对synchronized的特性、使用和锁机制的总结,我们可以更好地理解和使用synchronized来实现线程同步,从而避免并发中的线程安全问题。

zxj20041003的博客 1002

synchronized关键字和锁机制 -- 锁的特点、锁的使用、锁竞争和死锁、死锁的解决方法

介绍了 synchronized 关键字 和 锁机制,其中重点介绍了锁的特点、使用方法和死锁的相关内容。

想听风雨的博客 1862
上一篇: 简单生产者消费者模型(java实现)
下一篇: JDBC简单操作Demo
Tony L.Du
博客等级 码龄11年 73粉丝 156原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值