死锁的必要条件

  • 互斥条件
  • 请求和保持条件
  • 不剥夺条件
  • 环路等待条件
/*** 一个简单的死锁类*  当DeadLock的对象flag==1时(d1), 先锁定o1,睡眠500毫秒*  而d1在睡眠的时候留一个flag=0的对象(d2)线程启动,先锁定o2,睡眠500毫秒*   d1睡眠结束后需要锁定o2才能继续执行,而此时o2已经被d2锁定;*   d2睡眠结束后需要锁定o1才能继续执行,而此时o1已经被d1锁定;*   d1,d2相互等待,都需要得到对方锁定改的资源才能继续执行,从而死锁*/
@Slf4j
public class DeadLock implements Runnable {public int flag = 1;//静态资源是类的所有对象共享的private static Object o1 = new Object(), o2 = new Object();@Overridepublic void run() {log.info("flag:{}", flag);if(flag == 1){synchronized (o1) {try{Thread.sleep(500);} catch (Exception e){e.printStackTrace();}synchronized (o2) {log.info("1");}}}if (flag == 0) {synchronized (o2) {try {Thread.sleep(500);}catch (Exception e){e.printStackTrace();}synchronized (o1) {log.info("0");}}}}public static void main(String[] args) {DeadLock d1 = new DeadLock();DeadLock d2 = new DeadLock();d1.flag = 1;d2.flag = 0;//d1,d2都处于可执行状态,但JVM线程调度先执行哪个线程是不确定的。//d2的run()可能在d1的run()之前执行new Thread(d1).start();new Thread(d2).start();}
}

如何避免死锁:

  • 注意加锁顺序
  • 加锁时间限制,可以使用ReentrantLock可以设置获取所得给定时间,超过一定时间就释放自己占用的锁

spring与线程安全

spring bean:提供了一个scope属性来表示该bean的作用域,是bean的生命周期。例如scope=singleton,表示单例,在第一次注入时会产生一个单例对象,该对象会一直复用到应用结束,这时默认的scope;

scope=prototype,表示在每次注入时都会创建一个bean对象

java高并发(十九)死锁、spring线程安全相关推荐

  1. java高并发系列 - 第6天:线程的基本操作,必备技能

    新建线程 新建线程很简单.只需要使用new关键字创建一个线程对象,然后调用它的start()启动线程即可. Thread thread1 = new Thread1(); t1.start(); 那么 ...

  2. java高并发(九)线程封闭

    上一节介绍了不可变对象,通过在某些情况下将不会修改的类对象设计成不可变对象,来让对象在多个线程间保证对象是线程安全的.归根到底,相当于躲避开了并发问题,实现好的并发是一件很困难的事情,所以很多时候都想 ...

  3. Java高并发编程详解系列-线程上下文设计模式及ThreadLocal详解

    导语   在之前的分享中提到过一个概念就是线程之间的通信,都知道在线程之间的通信是一件很消耗资源的事情.但是又不得不去做的一件事情.为了保证多线程线程安全就必须进行线程之间的通信,保证每个线程获取到的 ...

  4. Java高并发编程:性能与线程竞争

    线程的最主要目的是提高程序的运行性能,线程可以使程序更加充分地发挥系统地可处理能力,从而提高系统的资源利用率.此外,线程还可以使程序在运行现有的任务的情况下即开始处理新的任务.但性能的提升会导致复杂性 ...

  5. [高并发]Java高并发编程系列开山篇--线程实现

    Java是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相 ...

  6. Java高并发编程详解系列-线程通信

      进程间的通信,又被称为是进程内部的通信,我们都知道每个进程中有多个线程在执行,多个线程要互斥的访问共享资源的时候会发送对应的等待信号或者是唤醒线程执行等信号.那么这些信号背后还有什么样的技术支持呢 ...

  7. Java高并发编程详解系列-线程安全数据同步

    在多线程中最为复杂和最为重要的就是线程安全.多个线程访问同一个对象的时候会导致线程安全问题.通过加锁可以避免这种问题.但是在串行执行的过程中又不用考虑线程安全问题,而使用串行程序效率低没有办法将CPU ...

  8. java高并发编程艺术_[高并发]Java高并发编程系列开山篇--线程实现

    Java是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相 ...

  9. java高并发程序设计(二)线程状态,sychronized,wait,notify,AtomicInteger,CountDownLatch

    线程同步之sychronized细究 1.1 关于sychronized的小例子 多线程环境下,如果采用有锁编程可以考虑Sychronized和ReentrantLock,首先介绍一下sychroni ...

  10. Java高并发和多线程系列 - 1. 线程基本概念

    1. 什么是线程? 线程和进程的区别 在了解线程的概念前,我们应该先知道什么是进程? 进程是操作系统的基本概念之一, 它是正在执行的程序实例. * 下面的一些进程的基本概念你可以了解下 ------- ...

最新文章

  1. Ultrahaptics公司为Holodeck型触觉关闭了2300万美元的资金回合
  2. 《电子基础与维修工具核心教程》——1.3 弱电、强电、高压电
  3. Pair Project: API设计 by Xiao Li and Yishi Xing
  4. 消息发送到消息接收的整体流程
  5. OSPF地址汇总配置
  6. MySQL 创建用户
  7. Nginx handler模块
  8. ssl双向认证_详解TLS/SSL运行机制
  9. 实用的无锁队列(一)
  10. MySQL之创建表以及数据库增删改操作
  11. Cisco6500的NAT配置方法
  12. 文字处理技术:最小布局
  13. mysql关联分组查询,Mysql 分组查询/子查询/关联查询【总结】
  14. Springer期刊参考文献格式如何用Latex生成
  15. mysql 存储 海量图片_数据库中存储大量图片设计
  16. 企业微信的项目管理 - TAPD
  17. 【高德地图API】申请key全流程
  18. 《CSAPP》(第3版)答案(第四章)
  19. 2017年EI收录的中国期刊目录
  20. 什么是工业AGV导航读码器?用在什么地方?

热门文章

  1. Elasticsearch 架构原理
  2. mysql长连接与短连接
  3. 微信小程序将页面按钮悬浮固定在底部
  4. linux 共享内存陷井,linux共享内存应用与陷阱
  5. PHP在函数体中传递与接收参数
  6. PHP生成Mysql数据字典
  7. 制作计算器窗口java_Java实现的窗口计算器
  8. 法国spin高等计算机学校,法国顶尖“大矿”,一起去矿校挖矿吧!
  9. oc语言和c语言,C语言及OC语言初期学习心得
  10. mysql 常用优化方案_项目中常用的 19 条 MySQL 优化方案