Java死锁

代码:

package Test0629;public class BankTest {static Bank b1 = null;static Bank b2 = null;public static void main(String[] args) {Thread t1 = new Thread(){public void run(){b1 = Bank.getInstance();}};Thread t2 = new Thread(){public void run(){b2 = Bank.getInstance();}};t1.start();t2.start();try {t1.join();} catch (InterruptedException e) {throw new RuntimeException(e);}try {t2.join();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(b1);System.out.println(b2);System.out.println(b1 == b2);}
}
class Bank{private  Bank(){}private static Bank instance = null;public static Bank getInstance() {if(instance == null){try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}instance = new Bank();}return instance;}
}

方式一:

package Test0629;public class BankTest {static Bank b1 = null;static Bank b2 = null;public static void main(String[] args) {Thread t1 = new Thread(){public void run(){b1 = Bank.getInstance();}};Thread t2 = new Thread(){public void run(){b2 = Bank.getInstance();}};t1.start();t2.start();try {t1.join();} catch (InterruptedException e) {throw new RuntimeException(e);}try {t2.join();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(b1);System.out.println(b2);System.out.println(b1 == b2);}}class Bank{private  Bank(){}private static Bank instance = null;public static  Bank getInstance() { //同步监视器,默认为Bank.classif(instance == null){synchronized(Bank.class){if(instance == null){try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}instance = new Bank();}}}return instance;}}

方式二:
package Test0629;public class BankTest {static Bank b1 = null;static Bank b2 = null;public static void main(String[] args) {Thread t1 = new Thread(){public void run(){b1 = Bank.getInstance();}};Thread t2 = new Thread(){public void run(){b2 = Bank.getInstance();}};t1.start();t2.start();try {t1.join();} catch (InterruptedException e) {throw new RuntimeException(e);}try {t2.join();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(b1);System.out.println(b2);System.out.println(b1 == b2);}}class Bank{private  Bank(){}private static Bank instance = null;public static synchronized Bank getInstance() { //同步监视器,默认为Bank.classif(instance == null){if(instance == null){try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}instance = new Bank();}}return instance;}}

线程的同步机制带来的问题:死锁

1如何看待死锁?

2。诱发死锁的原因?

 

诱发死锁的原因

。互斥条件

。占用且等待

。不可抢夺 (或不可抢占)

。循环等待

以上4个条件,同时出现就会触发死锁。

3,如何避免死锁?

解决死锁:死锁一旦出现,基本很难人为干预,只能尽量规避。可以考虑打破上面的诱发条件,

针对条件1: 互斥条件基本上无法被破坏。因为线程需要通过互斥解决安全问题。

针对条件2:可以考虑一次性申请所有所需的资源,这样就不存在等待的问题

针对条件3:占用部分资源的线程在进一步申请其他资源时,如果申请不到,就主动释放掉已经占用的资源.

针对条件4:可以将资源改为线性顺序。申请资源时,先申请序号较小的,这样避免循环等待问题

除了使用synchronized同步机制处理线程安全问题之外,还可以使用jdk5.@提供的Lock锁的方式

1.:

步骤1,创建Lock的实例,需要确保多个线程共用同一个Lock实例!需要考虑将此对象声明为static final

步骤2.执行LockT方法,锁定对共享资源的调用

步骤3。 unlock(的调用,释放对共享数据的锁定

2。面试题:

synchronized同步的方式 与Lock的对比 ?

synchronized不管是同步代码块还是同步方法,都需要在结束一对{}之后,释放对同步监视器的调用Lock是通过两个方法控制需要被同步的代码,更灵活一些。Lock作为接口,提供了多种实现类,适合更多更复杂的场景,效率更高。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fast admin报错:Unexpected token ‘<‘, “ (已解决)

报错信息: 在新加视图的时候的,点击编辑/添加忽然报这个错误,网上找了半天,js、视图、修修改改最后竟是一个小问题; 解决方法: 改为: 简单的说就是:btn-ajax ->btn-dialog

【MySQL】MySQL数据库,RDBMS 术语,使用说明和报错解决的详细讲解

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…

【强化学习】常用算法之一 “SAC”

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

【网络安全带你练爬虫-100练】第1练:发送请求获取返回内容

目录 一、前置知识1 二、前置知识2 requests库的7个主要方法 语法: 注解: 三、扩展工具 四、网络安全小圈子 一、前置知识1 顾名思义网络爬虫第一步,爬取目标 URL的网页的信息 可以使用 urllib.request 和 requests发送请求&#xff0…

浪潮发布G2平台

2017年2月28日下午,浪潮在北京粤财JW万豪酒店以“智变”为主题,发布新一代智能存储平台G2,该平台基于统一架构和In系列智能软件设计,在保障”三高”特性满足企业级关键数据存储、处理需求的同时,更强调数据生命周期的智…

了解浏览器缓存

什么是HTTP缓存,如何工作的? 当我们打开一个页面时,会向服务端发起很多次请求,如下图打开百毒首页,发起了HTML、各种图片、JS、CSS等资源共101次请求。这里面很多资源并不会频繁变化,每次打开页面都重新请…

为什么有了HTTP,还需要WebSocket协议?

目录 WebSocket是什么? WebSocket怎样建立连接? WebSocket的实际用途 WebSocket 与 HTTP 的选择 HTTP是基于TCP协议的,同一时间里,客户端和服务器只能有一方主动发数据,是半双工通信。 通常,打开某个网…

Html + Jquery + Vue前端学习笔记

文章目录 一,Vue1,v-model 数据绑定2,生成描述列表 二,HtmlJquery1,动态修改类名2,layui手风琴效果3,输入框样式修改4,多行文本显示省略号5,div内容居右6,字符…

k8s calico 网络异常处理

故障 worker3故障重启后,该节点的 pod 访问不了其它节点服务 2023-06-26T07:44:41.041Z ERROR setup unable to start manager {"error": "Get \"https://10.244.64.1:443/api?timeout32s\": dial tcp 10.244.64.1:443: i/o…

SQL题型:根据逗号拆分列

例1&#xff1a; 表&#xff1a; 要实现的结果&#xff1a; 代码&#xff1a; select a.id as hyId,substring_index(substring_index(a.ch_ry_mc, ,,b.help_topic_id 1 ),,, - 1) AS CH_RY_ID FROM rsgl_hygl_hyxx a JOIN mysql.help_topic b ON b.help_topic_id < ( l…

【嵌入式Qt开发入门】初识Qt——Linux下安装Qt

Qt 是什么&#xff1f; Qt 是一个跨平台的 C开发库。主要用来开发图形用户界面&#xff08;Graphical User Interface&#xff0c;简 称 GUI&#xff09;程序。 Qt 虽然经常被当做一个 GUI 库&#xff0c;用来开发图形界面应用程序&#xff0c;但这并不是 Qt 的全部&#xff1b…

PHP表单传值和文件上传:深入解析数据交互与文件处理技术

目录 表单传值 为什么要表单传值&#xff1f; 表单传值的方式 GET传值 POST传值 GET和POST两种传参方式的不同&#xff1a; PHP接受数据的三种方式 PHP处理复选框数据 复选框表单的命名方式 复选框数据的接受形式 复选框数据的常见处理 复选框细节&#xff1a; 文件…