Java同步锁(synchronized)、锁(lock)以及死锁

1 package com.cn.donleo.thread.phone; 2 3 import java.util.concurrent.locks.Lock; 4 import java.util.concurrent.locks.ReentrantLock; 5 6 /** 7 * @author liangd 8 * date 2020-11-02 08:53 9 * code 10 */ 11 public class MyPhone implements Runnable { 12 13 private int phoneNum = 100; 14 /* 15 * 同步锁的两种方式: 16 * 1、锁对象 synchronized (this) 17 * 2、锁方法 public synchronized void run() 锁方法其实是锁的当前对象,synchronized (this) ,synchronized (MyPhone.class) 18 * 同步锁优缺点: 19 * 1、解决了多线程安全问题 20 * 2、增加了线程同步锁后,必须一个一个执行,浪费资源,降低了程序的运行效率 21 */ 22 /** 23 * 1、对不同的runnable传入同一个lock 24 * 2、lock和synchronized类似,只不过这个是手动上锁,手动释放锁 25 * synchronized属于自动上锁和释放 26 * 3、Lock和synchronized的区别 27 * 1)synchronized试用于并发量小的,lock更适用于并发量大的 28 * 2)lock更灵活,可以自由定义多把锁的枷锁解锁顺序 29 * 3)Lock还有中断锁和定时锁。 30 * 4)当线程运行到synchronized同步方法中,就会拥有obj对象的对象锁 31 * 5)Wait会释放对象锁,sleep不会释放对象锁 32 * 6)Synchronized用对象锁: 33 */ 34 private Lock lock = new ReentrantLock(); 35 36 @Override 37 public synchronized void run() { 38 //while(true)是一个无穷循环语句 我们必须在他的循环语句内部加入一个判断 当他达到了什么要求就会跳出 39 while (true) { 40 //锁对象,指当前对象 41 // synchronized (this){ 42 // synchronized ("Myphone"){ 43 if (phoneNum > 0) { 44 lock.lock(); 45 try { 46 /* 47 1、卖手机的时候不可能都是同时卖出或者被预定在MyPhone类里面增加sleep 48 休眠100毫秒 49 2、淘宝最后一部手机进来 50 京东也有人预定手机,现在没有--,也可以进来 51 同理,拼多多也有人预定手机,现在没有--,也可以进来 52 3、会出现负数 53 */ 54 Thread.sleep(100); 55 } catch (InterruptedException e) { 56 e.printStackTrace(); 57 } finally { 58 //lock.unlock()要放在finally里面,因为如果上面报异常的情况下锁就不会手动释放,放在finally里面始终要执行 59 lock.unlock(); 60 } 61 System.out.println(Thread.currentThread().getName() + "卖出了一部手机,还剩余" + --phoneNum + "部手机"); 62 } else { 63 System.out.println("手机已经全部卖完,请下次再来"); 64 return; 65 } 66 // } 67 68 } 69 } 70 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwfgsj.html