java两种方式实现死锁
来源:互联网 发布:汇编语言用什么软件 编辑:程序博客网 时间:2024/06/07 21:13
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
(一)对于第二种情况
public class LockTest implements Runnable { private Object o1 = new Object(); private Object o2 = new Object(); private boolean flag=true; public void run() { if (flag) { flag=false; synchronized (o1) { System.out.println(Thread.currentThread().getName() + " have o1"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o2) { System.out.println(Thread.currentThread().getName() + " have o2"); } } } else { flag=true; synchronized (o2) { System.out.println(Thread.currentThread().getName() + " have o2"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o1) { System.out.println(Thread.currentThread().getName() + " have o1"); } } } } public static void main(String[] args) { LockTest b1= new LockTest(); Thread thread1=new Thread(b1); Thread thread2=new Thread(b1); thread1.start(); thread2.start(); }}
(二)对于第四种情况
public class LockTest implements Runnable { private Object o1 = new Object(); private Object o2 = new Object(); private Object o3 = new Object(); private int flag=1; public void run() { if (flag==1) { flag=2; synchronized (o1) { System.out.println(Thread.currentThread().getName() + " have o1"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o2) { System.out.println(Thread.currentThread().getName() + " have o2"); } } } else if(flag==2) { flag=3; synchronized (o2) { System.out.println(Thread.currentThread().getName() + " have o2"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o3) { System.out.println(Thread.currentThread().getName() + " have o3"); } } } else { flag=1; synchronized (o3) { System.out.println(Thread.currentThread().getName() + " have o3"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o1) { System.out.println(Thread.currentThread().getName() + " have o1"); } } } } public static void main(String[] args) { LockTest b1= new LockTest(); Thread thread1=new Thread(b1); Thread thread2=new Thread(b1); Thread thread3=new Thread(b1); thread1.start(); thread2.start(); thread3.start(); }}
例子不难看懂,面试的时候有可能要求当场就要写。
阅读全文
1 0
- java两种方式实现死锁
- java 死锁两种实现
- Java实现多线程的两种方式
- java 两种方式实现自定义排序
- Java两种方式实现多线程对比
- Java定时器 实现的两种方式
- Java定时器 实现的两种方式
- java--多线程实现两种方式
- Java实现多线程的两种方式
- java内省的两种实现方式
- Java多线程实现的两种方式
- java多线程两种实现方式
- Java 多线程实现的两种方式
- Java中的两种多线程实现方式
- java 多线程 两种实现方式
- Java多线程的两种实现方式
- java实现线程的两种方式
- Java实现线程的两种方式
- 4个数和为0
- Android_MVP之错误异常信息收集处理 CrashHandler
- I2S和PCM
- mysql 小技巧
- python爬虫-多进程
- java两种方式实现死锁
- Solr-6.5.1从mysql数据库全量导入数据
- 自定义圆形、半圆形ProgressBar
- @RequestMapping @ResponseBody 前台 ajax 后台传数据
- 食物链
- js中获取 table节点各tr及td的内容方法
- java.net.BindException: 无法指定被请求的地址: Service 'sparkDriver' failed after 16 retries!
- 点、线导出含高程值的表格
- linux终端下常用的操作快捷键