Java 死锁(DeadLock)实例分析和预防[base jdk8]
2018-02-03 11:49
381 查看
synchronized实现死锁
/** * Created by Administrator on 2018/2/3. */ public class SynchronizedDeadLockTest { static Object src1 = new Object(); static Object src2 = new Object(); public static void main(String[] args) { Thread t1 = new Thread(new DeadARunnable(), "t1"); Thread t2 = new Thread(new DeadBRunnable(), "t2"); t1.start(); t2.start(); } } class DeadARunnable implements Runnable { @Override public void run() { synchronized (SynchronizedDeadLockTest.src1){ try{ System.out.println(Thread.currentThread().getName()+" get src1 ing!"); Thread.sleep(500); System.out.println(Thread.currentThread().getName()+" after sleep 500ms!"); }catch(Exception e){ e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" need src2 and waiting!"); /** * Thread t2 try get source src2 when locked source src1 */ synchronized (SynchronizedDeadLockTest.src2){ System.out.println(Thread.currentThread().getName()+" get src2 ing!"); } } } } class DeadBRunnable implements Runnable { @Override public void run() { synchronized (SynchronizedDeadLockTest.src2){ try{ System.out.println(Thread.currentThread().getName()+" get src2 ing!"); Thread.sleep(500); System.out.println(Thread.currentThread().getName()+" after sleep 500ms!"); }catch(Exception e){ e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" need src1 and waiting!"); /** * Thread t1 try get source src1 when locked source src2 */ synchronized (SynchronizedDeadLockTest.src1){ System.out.println(Thread.currentThread().getName()+" get src1 ing!"); } } } }
饥饿
指的线程无法访问到它需要的资源而不能继续执行的一种状态。引发饥饿最常见资源就是CPU时钟周期。虽然在Thread API中由指定线程优先级的机制,但是只能作为操作系统进行线程调度的一个参考,操作系统在进行线程调度是平台无关的,会尽可能提供公平的、活跃性良好的调度,那么即使在程序中指定了线程的优先级,也有可能在操作系统进行调度的时候映射到了同一个优先级。通常情况下,不要区修改线程的优先级,一旦修改程序的行为就会与平台相关,并且会导致饥饿问题的产生。在程序中使用的Thread.yield或者Thread.sleep表明该程序试图客服优先级调整问题,让优先级更低的线程拥有被CPU调度的机会。活锁
指的是线程不断重复执行相同的操作,但每次操作的结果都是失败的。尽管这个问题不会阻塞线程,但是程序也无法继续执行。活锁通常发生在处理事务消息的应用程序中,如果不能成功处理这个事务那么事务将回滚整个操作。解决活锁的办法是在每次重复执行的时候引入随机机制,这样由于出现的可能性不同使得程序可以继续执行其他的任务。相关文章推荐
- java死锁的原因分析及解锁和预防措施
- Java同步和死锁的实例分析
- 通过Android trace文件分析死锁ANR实例过程
- 黑马程序员一java中内部类的结构分析实例
- 写 Java 程序最容易犯的 21 种错误实例分析
- 【Java学习笔记之二十二】解析接口在Java继承中的用法及实例分析
- Java Web 2.1.6 2-7实例分析
- HDFS API的java代码分析与实例
- java编程约瑟夫问题实例分析
- Java并发之死锁实例
- 三个实例演示 Java Thread Dump 日志分析
- java读取properties文件的方法实例分析
- 实例分析Java Class的文件结构
- Java中的多态用法实例分析
- Java程序最容易犯的21种错误实例分析
- 全面分析iterator(迭代器)模式,以及具体java实例
- Java Class文件结构解析 及 实例分析验证
- Java方法的可变参数类型实例分析
- 实例分析Java Class的文件结构
- 写 Java 程序最容易犯的 21 种错误实例分析