线程同步
什么是线程同步?也是并发问题
同一个对象被多个线程同时操作。
死锁
//死锁:多个线程互相抱着对方需要的资源,然后形成僵持 public class DeadLock { public static void main(String[] args) { MakeUp m1 = new MakeUp(0,"小红"); MakeUp m2 = new MakeUp(1,"小蓝"); m1.start(); m2.start(); } } //口红 class Lipstick{ } //镜子 class Mirror{ } class MakeUp extends Thread{ //需要的资源只有一份,用static来保证只有一份 static Lipstick lipstick =new Lipstick(); static Mirror mirror =new Mirror(); int choose; //选择 String name; //使用化妆的人 MakeUp(int choose,String name){ this.choose =choose; this.name =name; } @Override public void run(){ //化妆 try { make(choose,name); } catch (InterruptedException e) { e.printStackTrace(); } } public void make(int choose,String name) throws InterruptedException { if (choose==0){//选择口红 synchronized (lipstick){ System.out.println(name+"选择了口红"); Thread.sleep(1000); synchronized (mirror){ System.out.println(name+"选择了镜子"); } } }else{ synchronized (mirror){ System.out.println(name+"选择了镜子"); Thread.sleep(1000); synchronized (lipstick){ System.out.println(name+"选择了口红"); } } } } }
解决:只要不要抱着对方的锁就可以了,把对方需要的资源释放
public void make(int choose,String name) throws InterruptedException { if (choose==0){//选择口红 synchronized (lipstick){ System.out.println(name+"选择了口红"); Thread.sleep(1000); // synchronized (mirror){ // System.out.println(name+"选择了镜子"); // } } synchronized (mirror){ System.out.println(name+"选择了镜子"); } }else{ synchronized (mirror){ System.out.println(name+"选择了镜子"); Thread.sleep(1000); // synchronized (lipstick){ // System.out.println(name+"选择了口红"); // } } synchronized (lipstick){ System.out.println(name+"选择了口红"); } } }