java 的死锁的个人理解

理解Java死锁之死锁检测 作者:禹明明,叩丁狼高级讲师。原创文章,转载请注明出处。看此文章前请先了解之前一篇文章 “Java死锁之理解死锁” 中的死锁示例我们在开发中应该尽量避免死锁,但是如果真的有死锁产生那么我们怎么在一个复杂的项目中快速的找到死锁产生的原因呢?我大概总结了一下常用的几种方式:使用JConsole检测死锁在我们的JAVA_HOME/bin目录下我们可以找到一个jdk提供的虚拟机监控工具叫Jconsole,... 阅读详情

多把锁的时候才会出现死锁,


import sun.jvm.hotspot.tools.JMap;

import java.lang.reflect.Method;

/**
 * Created by zhangyinshan on 2016/11/30.
 */
public class SyncDemo {

//    public static synchronized void staticSync(){
//        System.out.println("static "+Thread.currentThread().getName());
//    }
//
//    public synchronized void notStaticSync(){
//        System.out.println("not Static "+Thread.currentThread().getName());
//    }
    public static void main(String[] args){

//        staticSync();
//
//        SyncDemo syncDemo = new SyncDemo();
//        syncDemo.notStaticSync();

        for (int i = 0; i < 50; i++) {
            test();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void test(){

        System.out.println("not Static "+Thread.currentThread().getName());

//        Ticket ticket1 = new Ticket();
//        Ticket ticket2 = new Ticket();
//        Ticket ticket3 = new Ticket();
//        Ticket ticket4 = new Ticket();
//
//        Thread thread1 = new Thread(ticket1);
//        Thread thread2 = new Thread(ticket2);
//        Thread thread3 = new Thread(ticket3);
//        Thread thread4 = new Thread(ticket4);
//
//        thread1.start();
//        thread2.start();
//        thread3.start();
//        thread4.start();


        //如果是四个窗台一起买50张票,那么ticket只有一个对象

//        Ticket ticket1 = new Ticket();
//
//        Thread thread1 = new Thread(ticket1);
//        Thread thread2 = new Thread(ticket1);
//        Thread thread3 = new Thread(ticket1);
//        Thread thread4 = new Thread(ticket1);
//
//        thread1.start();
//        thread2.start();
//        thread3.start();
//        thread4.start();

        //上面的情况会出现例如第31张票在最后的时候才卖出,因为在例如thread2是31张票,当它想要执行输出的时候,cpu被其他的进程抢过去了
//
//        TicketSync ticket1 = new TicketSync();
//
//        Thread thread1 = new Thread(ticket1);
//        Thread thread2 = new Thread(ticket1);
//        Thread thread3 = new Thread(ticket1);
//        Thread thread4 = new Thread(ticket1);
//
//        thread1.start();
//        thread2.start();
//        thread3.start();
//        thread4.start();

        //函数的同步锁,默认的是对象本身,如果是static的话,那么锁就是该类的.class对象

        //new Thread(new TicketSyncObject()).start();

        //当有方法的锁是.class对象的,有的是类的变量的对象的时候就不是同步的了
        //new Thread(new TicketSyncObjectNotStatic()).start();

        //死锁,就是我要你的锁,你要我的锁导致的

        new Thread(new TicketSyncObjectNotStaticDeadLock1()).start();
        new Thread(new TicketSyncObjectNotStaticDeadLock2()).start();

        //测试两个锁的顺序是一样的情况
        //new Thread(new DeadLockShunXu1()).start();
        //new Thread(new DeadLockShunXu2()).start();

    }

}


class Ticket implements Runnable{

    int num = 50;
    @Override
    public void run() {
        while(num>0){
            System.out.println(Thread.currentThread()+"sale ticket "+num);
            num--;
        }
    }
}

class TicketSync implements Runnable{

    int num = 50;
    @Override
    public synchronized void run() {
        while(num>0){
            System.out.println(Thread.currentThread()+"sale ticket "+num);
            num--;
        }
    }
}


class TicketSyncObject implements Runnable{

    @Override
    public synchronized void run() {
        new Thread(new Runnable(){

            @Override
            public void run() {
                get();
            }
        }).start();

        new Thread(new Runnable(){

            @Override
            public void run() {
                put();
            }
        }).start();
    }

    public static synchronized int get(){
        for (int i = 0; i < 100; i++) {

            System.out.println(Thread.currentThread()+"get1  "+i);
            System.out.println(Thread.currentThread()+"get2  "+i);
            System.out.println(Thread.currentThread()+"get3  "+i);
        }

        return 1;
    }

    public static synchronized void put(){
        //synchronized (TicketSyncObject.class) {
            for (int i = 0; i < 100; i++) {
                System.out.println(Thread.currentThread() + "put1  " + i);
                System.out.println(Thread.currentThread() + "put2  " + i);
                System.out.println(Thread.currentThread() + "put3  " + i);
            }
        //}
    }
}


class TicketSyncObjectNotStatic implements Runnable{

    @Override
    public synchronized void run() {
        new Thread(new Runnable(){

            @Override
            public void run() {
                get();
            }
        }).start();

        new Thread(new Runnable(){

            @Override
            public void run() {
                put();
            }
        }).start();
    }

    public static synchronized void get(){
        for (int i = 0; i < 100; i++) {

            System.out.println(Thread.currentThread()+"get1  "+i);
            System.out.println(Thread.currentThread()+"get2  "+i);
            System.out.println(Thread.currentThread()+"get3  "+i);
        }
    }

    public void put(){
        synchronized (this) {
            for (int i = 0; i < 100; i++) {
                System.out.println(Thread.currentThread() + "put1  " + i);
                System.out.println(Thread.currentThread() + "put2  " + i);
                System.out.println(Thread.currentThread() + "put3  " + i);
            }
        }
    }
}



class TicketSyncObjectNotStaticDeadLock1 implements Runnable{


    @Override
    public void run() {
        synchronized (Integer.class){
            System.out.println("DeadLock1 "+" get "+"Integer.class key "+"  want Double.class key");
            synchronized (Double.class){
                System.out.println("DeadLock1 "+" get Double.class key");
            }
        }
    }
}

class TicketSyncObjectNotStaticDeadLock2 implements Runnable{

    @Override
    public void run() {
        synchronized (Double.class){

            System.out.println("DeadLock2222 "+" get "+"Double.class key "+"  want Integer.class key");

            synchronized (Integer.class){
                System.out.println("DeadLock2222 "+" get Double.class key");
            }
        }
    }
}



class DeadLockShunXu1 implements Runnable{


    @Override
    public void run() {
        synchronized (Integer.class){
            System.out.println("DeadLock1 "+" get "+"Integer.class key "+"  want Double.class key");
            synchronized (Double.class){
                System.out.println("DeadLock1 "+" get Double.class key");
            }
        }
    }
}

class DeadLockShunXu2 implements Runnable{

    @Override
    public void run() {
        synchronized (Integer.class){

            System.out.println("DeadLock2222 "+" get "+"Integer.class key "+"  want Double.class key");

            synchronized (Double.class){
                System.out.println("DeadLock2222 "+" get Double.class key");
            }
        }
    }
}



使用基于python的neurora进行表征相似性分析(RSA) 发现了一款用于表征分析的Python API,还是挺方便的,这里简单介绍一下进行表征相似性分析的使用方法。 阅读详情

相关推荐

手把手教你用若依WMS搭建企业级仓库管理系统(Vue+Spring Boot实战)

本文提供了一份基于若依框架(RuoYi)快速搭建企业级仓库管理系统(WMS)的实战指南。详细介绍了从环境准备、项目初始化到核心功能模块(如入库流程、库存管理看板)深度定制的全过程,并涵盖Lodop打印集成、移动端PWA适配及生产环境Docker部署等高级主题,帮助开发者高效构建稳定可用的WMS系统。

weixin_29015899的博客 564

JAVA——死锁详解

死锁

lzhNox的博客 4227

深度解析direct path write temp与ASM IO性能问题:Oracle 19.17视图查询优化指南

本文深度解析了Oracle 19.17版本中复杂视图查询出现`direct path write temp`与`ASM IO for non-blocking poll`性能瓶颈的根本原因。通过对比11.2.0.4版本的执行计划差异,文章提供了从CBO参数调整、存储层优化到SQL架构重构的完整实战调优指南,帮助DBA有效解决升级后的查询性能问题。

2y3u4i5o6p的博客 1100

Java中什么是死锁,怎么解决死锁的问题?

Java中什么是死锁,怎么解决死锁的问题?

Fover_Night的博客 669

postgresql 数据库 timescaledb 函数time_bucket_gapfill()报错解决及更换 license

最近在工作中使用postgresql 和 timescaledb 的time_bucket_gapfill()函数 报错,让更换license,在网上找了一大圈,没有找到,最后解决了这个问题,这篇文章记录我的解决办法查看timescaledb.license参数命令:show timescaledb.license;修改命令: 结果不行,报错如下:lter system set timescaledb.license=‘timescale’;那只能换包了如果出现上面那种情况,那我们只能先从官网上下载带 '

yang_z_1的博客 3249

详解Σ-Δ型ADC拓扑结构的基本原理

现在,总环路滤波器的H(f)具有更大的滚降,Mod 2型的噪声传递函数具有40 dB/十倍频程的上升速率。同样,当正弦波输入为负满量程时,+1和–1之间的转换会减少,输出以–1为主。噪声传递函数是一个高通滤波器函数,提供噪声整形,在DC附近的较低频率,对量化噪声有很强的抑制。H(f)是环路滤波器的函数,定义噪声和信号的传递函数。Σ-Δ型ADC的噪底由热噪声决定,而不受量化噪声的限制。量化噪声为量化器的输入与输出之差。图5. Mod 1 Σ-Δ环路的线性模型(b),包括方程、滤波器、信号和噪声传递函数图。

qq_43416206的博客 1810

Java如何查看死锁?

ava中当我们的开发涉及到多线程的时候,这个时候就很容易遇到死锁问题,刚开始遇到死锁问题的时候,我们很容易觉得莫名其妙,而且定位问题也很困难。 因为涉及到java多线程的时候,有的问题会特别复杂,而且就算我们知道问题出现是因为死锁了,我们也很难弄清楚为什么发生死锁,那么当我们遇到了死锁问题,我们应该如何来检测和查看死锁呢? Java中jdk 给我们提供了很便利的工具,帮助我们定位和分析死锁问题

ZK_小小世界的专栏 2万+

图神经网络实战(21)——图神经网络的可解释性

在本节中,我们探讨了应用于图神经网络 (Graph Neural Networks, GNN) 的可解释性人工智能 (Explainable Artificial Intelligence, XAI) 技术。可解释性是许多领域的关键要素,可以帮助我们建立更好的模型。我们介绍了不同的局部解释技术,并重点讨论了 GNNExplainer (基于扰动的方法),在图分类任务中应用 GNNExplainer。

盼小辉丶的博客 9556

Java 死锁的个人尝试和理解

死锁的例子是参考网上的例子,主要是想学习一下jstack命令来识别死锁。 package basic; import smallbird.Tools; public class DeadThreadExample { public static void main(String[] args) { Thread1 t1=new Thread1(); Thread

nyhyn的专栏 793

实战:RK3568 Android14 集成 AP6212A WiFi/BT 二合一模块

AP6212A 的集成在 RK3568 上非常成熟。只要电源、32K 时钟、SDIO 线序、UART 流控这四点硬件没问题,软件上主要是 DTS 对应的 GPIO 别填错即可。希望这篇博文能帮你一次点亮 WiFi 和蓝牙!

qq_33427070的博客 1450

【系统架构设计师】论文:论虚拟现实技术的应用与发展

虚拟现实技术是当前科学研究的热点,同时也是国家大力支持发展的核心技术之一。所谓虚拟现实,就是通过计算机等虚拟手段来构造一个非常接近真实世界的虚拟环境,它主要体现在视觉、触觉、嗅觉等方面的逼真模拟来达到高度的沉浸性,也就是如我们通常所说的“身临其境”。

数据知道的博客 1万+

java中活锁和死锁的区别_死锁、活锁、饿死和阻塞的个人理解

以下个人理解,请各位前辈多多指教:死锁:① 互斥条件:指进程对所分配到的资源进行排它性使用,在一段时间内某资源只由一个进程占用,如果此时还有其他进程请求资源,则请求者只能等待,直至占有资源的进程被释放。② 请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。③ 不剥夺条件:指进程已获得的资源,在未使用完...

weixin_39959569的博客 227

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java多线程-死锁的出现和解决

/这里一个log日志try {//生产者B//我们生产的顺序真好好生产者A相反,我们首先需要对象锁lockB,然后需要对象锁lockA.@Override//这里一个log日志try {//这里一个log日志try {//这里运行线程。

VIP129370的博客 1085

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java进阶之并发编程一ReentrantLock的实际应用和线程中断EXAMPLE

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。实现3个线程分别打印指定数字和线程死锁进行线程中断。...

m0_67403013的博客 176

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

深入理解与避免Java 死锁

死锁是指两个或多个线程相互等待对方释放资源,从而导致程序无法继续执行的情况。例如,线程 A 持有资源 X,等待资源 Y;而线程 B 持有资源 Y,等待资源 X。这样,两个线程就陷入了死锁状态,无法继续执行。死锁是 Java 多线程编程中一个比较复杂但又非常重要的问题。了解死锁的产生条件以及如何避免死锁,对于编写高效、稳定的多线程程序至关重要。本文详细介绍了 Java 死锁的四个必要条件,即互斥条件、请求与保持条件、不剥夺条件和循环等待条件,并通过具体的例子和解决方案帮助读者更好地理解和避免死锁。

果酱 の 博客 1975

理解Java死锁原理

作者:禹明明 叩丁狼高级讲师。原创文章,转载请注明出处。线程死锁示例为了维护数据的一致性,多线程环境下必须对一些方法进行加锁,但是如果锁资源使用不当也会带来一些隐患,比如死锁。死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。先来看一下死锁产...

wolfcode_cn的博客 1187

请谈谈你对死锁的理解?

多线程和锁 多线程和锁作为并发编程的两个重要概念,在提升了程序性能的同时,也带来了一些编码的复杂性。锁的出现就是为了保证在多线程的时候操作一组资源数据的一致性,我们在给资源加上锁之后,只有拥有了这个锁的线程才能操作此资源,其余的线程只能排队。 举个例子:例如你去换衣间试衣服,你进去了把门锁上,那么在这期间谁都无法进入,等你开门出来,别人才能进入。 什么是死锁 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状

WormholeStack 5589

深入理解 Java 和 MySQL 中的死锁

在 Java 中,死锁通常发生在多个线程之间,因为线程间相互持有对方所需要的资源,并且都没有释放这些资源。死锁的发生与线程同步有关,特别是使用锁(如或)来控制共享资源访问时,如果锁的管理不当,就容易发生死锁。在 MySQL 中,死锁通常发生在多个事务之间,它们在并发执行时互相竞争数据库中的资源(如行锁或表锁)。当每个事务都持有其他事务所需要的锁并且无法继续执行时,死锁就发生了。MySQL 的死锁处理机制和 Java 的死锁有所不同,MySQL 可以自动检测并回滚其中一个事务,以解决死锁。

一碗黄焖鸡三碗米饭的博客 758

【多线程篇21】:深入浅出理解Java死锁

摘要:死锁是多线程编程中因争夺资源导致的互相等待现象,常见于线程以不同顺序获取多把锁的情况。死锁产生的四个必要条件是互斥、请求与保持、不可剥夺和循环等待。通过破坏任一条件即可预防死锁,最常用的方法是强制线程按照统一顺序获取锁,避免循环等待。其他方案包括一次性申请所有资源或使用可超时的锁机制。理解死锁原理及预防方法对编写健壮的多线程程序至关重要。

lyh2004_08的博客 1605

Java线程之如何分析死锁及避免死锁

什么是死锁 java中的死锁是一种编程情况,其中两个或多个线程被永久阻塞,Java死锁情况出现至少两个线程和两个或更多资源。 在这里,我们将写了一个简单的程序,它将导致java死锁场景,然后我们将分析它。 怎么实现死锁 下面我们一起看一个简单的死锁事例,在主线程中每隔5秒钟启动一个线程,每个线程的执行时间是3秒钟 package com.lkf.mulithread; ...

码客 1万+

Java死锁代码演示(史上最通俗理解)

Java死锁代码演示 死锁的概念 知识储备 对象锁:Java一切皆对象,每个类都有一个class文件。由class文件可以new出对象,我们简单认识 下java对象,对象有个对象头信息,也就是这个对象概述,其中一条信息就是对象锁,也就是我们当前对象有没有被锁定,被哪个引用锁定。 synchronized:synchronized是java关键词,如果运用到方法上代表我们锁的是这个方法,如果我们锁的代码块,代表再这个代码块内我们持有这个锁,Java Effective也是提倡减小锁的范围。我们进入同步代码

三少说 2655

死锁的理解

一、死锁的概念 死锁(英语:deadlock),又译为死结,计算机科学名词。当两个以上的运算单元,双方都在等待对方停止运行,以获取系统资源,但是没有一方提前退出时,就称为死锁。在多任务操作系统中,操作系统为了协调不同行程,能否获取系统资源时,为了让系统正常运作,必须要解决这个问题。另一种相似的情况称为“活锁”。(wiki) 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永.

M2嵌入式 2376

Java并发之死锁详解

带你理解Java并发中的死锁以及解决方法

个人博客,欢迎收藏。 1115

Java死锁的原因例子及解决方法

运行结果:结果显示两个线程最后都在等待对方释放锁,最终进入了死锁状态。@Override运行结果:结果显示进入两次方法,但是并没有走完,发生死锁。一旦出现死锁,整个程序既不会发生任何错误,也不会给出任何提示,只是所有线程处于阻塞状态,无法继续。java虚拟机没有提供检测,也没有采取任何措施来处理死锁的情况,所以多线程编程中,必须手动应该采取措施避免死锁。上面代码原来锁是加在方法上的,现在改为在方法内的一部分,这样在使用第二个锁时本身的锁已经释放了。

2401_85358350的博客 1332

Java 中的死锁

这样虽然避免了循环等待,但是这种方法是比较低效的,资源的执行速度回变慢,并且可能在没有必要的情况下拒绝资源的访问,比如说,进程c想要申请资源1,如果资源1并没有被其他进程占有,此时将它分配个进程c是没有问题的,但是为了避免产生循环等待,该申请会被拒绝,这样就降低了资源的利用率。这样的话,资源的利用率会得到提高,也会减少进程的饥饿问题。释放已经保持的资源很有可能会导致进程之前的工作实效等,反复的申请和释放资源会导致进程的执行被无限的推迟,这不仅会延长进程的周转周期,还会影响系统的吞吐量。

麦克马的博客 753

java 死锁 解决_Java死锁故障排除和解决

java 死锁 解决 JavaOne年度会议的一大优点是主题专家介绍了几个技术和故障排除实验室。 这些实验室之一尤其引起了我的关注:Java冠军Heinz Kabutz提出的“ HOL6500-查找和解决Java死锁 ”。 这是我在该主题上看到的最好的演示之一。 我建议您自己下载,运行和研究实验室。 本文将重温这个经典的线程问题,并总结提出的关键故障排除和解决方法。 我还将根据自己的多线程...

最佳 Java 编程 877
上一篇: jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
下一篇: boss 说的cap如何正确理解CAP理论?
千雅爸爸
博客等级 码龄18年 292粉丝 639原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值