多线程的基本创建
多线程的线程安全、锁、线程通讯
死锁案例(女孩化妆问题)
package com.liuyuhe;
/**
* 死锁:
* 过多的同步可能造成相互不释放资源,从而相互等待,一般发生于同步中持有多个对象的锁。
* @author Martin
* 解决方法:
* 不要在同一个代码块中,同时持有多个对象的锁。
*/
public class DeadLock {
public static void main(String[] args) {
Makeup girl1=new Makeup(1,"女孩1");
Makeup girl2=new Makeup(0,"女孩2");
girl1.start();
girl2.start();
}
}
//口红
class Lipstick{
}
//镜子
class Mirror{
}
//化妆
class Makeup extends Thread{
static Lipstick lipstick=new Lipstick();
static Mirror mirror=new Mirror();
//选择
int choice;
//名字
String girlName;
public Makeup(int choice,String girlName) {
this.choice=choice;
this.girlName=girlName;
}
public void run() {
makeup();
}
//相互持有对方的对象锁
public void makeup() {
if(choice==0) {
synchronized(lipstick) {//获得口红锁
System.out.println(this.girlName+"涂口红");
//1秒后想拥有镜子的锁
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(mirror) {//获得镜子锁
System.out.println(this.girlName+"照镜子");
}
}
}else {
synchronized(mirror) {//获得镜子锁
System.out.println(this.girlName+"照镜子");
//2秒后想拥有口红的锁
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(lipstick) {//获得口红锁
System.out.println(this.girlName+"涂口红");
}
}
}
}
}
JUC主要类的原理分析
同步类容器
并发类容器
多线程的实际应用——商品秒杀