发生死锁的情况:多个线程需要同时占用多个共享资源而发生需要互相死循环等待的情况

public class Mirror {   //镜子
}
public class Lipstick { //口红
}

线程类

public class Makeup implements Runnable{
static private Lipstick lipstick=new Lipstick(); //口红
static private Mirror mirror=new Mirror(); //镜子
private int choice; //0代表先拿口红,1代表先拿镜子mm
private String name; public Makeup(int choice,String name) {
this.choice = choice;
this.name=name;
} @Override
public void run() {
makeup();
}
public void makeup(){
if(choice==0){
synchronized (lipstick){
System.out.println(name+"涂口红");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (mirror){
System.out.println(name+"照镜子");
}
}
}else{
synchronized (mirror){
System.out.println(name+"照镜子");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lipstick){
System.out.println(name+"涂口红");
}
}
}
}
}
public class TestMakeup {
public static void main(String[] args) {
new Thread(new Makeup(0,"张柏芝")).start();
new Thread(new Makeup(1,"王菲")).start();
}
}

解决方案:

将嵌套的同步机制改为“顺序”的同步机制,即我不需要同时占有,这里只是一个例子

if(choice==0){
synchronized (lipstick){
System.out.println(name+"涂口红");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (mirror){
System.out.println(name+"照镜子");
}
}

Java多线程学习——死锁的一个容易理解的例子的更多相关文章

  1. Java多线程学习(转载)

    Java多线程学习(转载) 时间:2015-03-14 13:53:14      阅读:137413      评论:4      收藏:3      [点我收藏+] 转载 :http://blog ...

  2. java多线程学习笔记——详细

    一.线程类  1.新建状态(New):新创建了一个线程对象.        2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...

  3. 转:Java多线程学习(总结很详细!!!)

    Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程 ...

  4. Java多线程学习(吐血超详细总结)

    Java多线程学习(吐血超详细总结) 林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实 ...

  5. [转]Java多线程学习(总结很详细!!!)

    Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程 ...

  6. Java多线程学习(六)Lock锁的使用

    系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...

  7. Java多线程学习(二)synchronized关键字(1)

    转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ...

  8. Java多线程学习(一)Java多线程入门

    转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79640870 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...

  9. Java多线程学习笔记(一)——多线程实现和安全问题

    1. 线程.进程.多线程: 进程是正在执行的程序,线程是进程中的代码执行,多线程就是在一个进程中有多个线程同时执行不同的任务,就像QQ,既可以开视频,又可以同时打字聊天. 2.线程的特点: 1.运行任 ...

随机推荐

  1. 网页图片失效自动替换图片地址js代码

    当你网页中的图片失效之后它会显示你预先设定好的默认图片,而不是显示为一个大大的红叉叉. js脚本如下: <script language="javascript"> v ...

  2. 如何创建DLL,以及注入DLL

    为了防止忘记,特记下 DLL的创建,在VS2017中选择dll的创建 // dllmain.cpp : Defines the entry point for the DLL application. ...

  3. hive严格模式

    说真的,这个模式在我做sql开发的岁月里,从未用到过.用的都是动态分区非严格模式. 我的好友东岳同学在车上问我.确实问到了我 .体现出了我基本功不扎实的情况. 1.what is Hive严格模式 H ...

  4. mysql 发现 navicat 可以远程连接,代码无法远程连接

    navicat可以远程连接, root账号也可以用代码连接. 其他的用户无法远程连接. 原因: 1.先检查下 mysql数据库里面 的 servers 表是否存在. 2.更新或者创建用户之后 使用:  ...

  5. mysql NULL函数 语法

    mysql NULL函数 语法 作用:如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录.这意味着该字段将以 NULL 值保存. 说明:NULL 值的处理方式与其 ...

  6. c++11相关特性

    前言 发现好多情况下都会用到c++11的新特性啊. 所以稍稍总结一下,只会粗略的说,不会详细的讲…… upd.csp-s可能不是c++11标准,请慎用.(博主考试CE后的善意提醒) 1.auto&am ...

  7. 【bzoj4562】[Haoi2016]食物链

    *题目描述: 如图所示为某生态系统的食物网示意图,据图回答第1小题 现在给你n个物种和m条能量流动关系,求其中的食物链条数. 物种的名称为从1到n编号 M条能量流动关系形如 a1 b1 a2 b2 a ...

  8. 序列式容器————forward_list

    单链表的形式存储元素.forward_list 的模板定义在头文件 forward_list 中.fdrward_list 和 list 最主要的区别是:它不能反向遍历元素:只能从头到尾遍历. for ...

  9. 序列式容器————vector

    目录 介绍 1 创建 2 容量和大小 size() capacity() 3 resize() 4 reverse() 5 获取元素 front() back() 6 迭代器(待补充) 7 push_ ...

  10. Windows10 + VS2015 (Win SDK10)环境下的64位 VTK编译小结

    之前在学习vtk过程中,感觉vtk的编译还是很简单的,基本上不会碰到什么棘手的错误.但是,当我在Win10+VS2015这个环境下配置时,却遇到了麻烦.经过一番折腾之后,终于将vtkbian编译成功了 ...