题目:三个售票员 卖出 30张票 || 多线程编程的企业级套路+模板||synchronized与Lock的区别
生活随笔
收集整理的這篇文章主要介紹了
题目:三个售票员 卖出 30张票 || 多线程编程的企业级套路+模板||synchronized与Lock的区别
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?
package com.dym.juc;//資源類 class Ticket {private int number =30;public synchronized void saleTicket(){if(number>0){System.out.println(Thread.currentThread().getName()+"\t賣出第:"+(number--)+"\t還剩下:"+number);}}}//題目:三個售票員 賣出 30張票 // 多線程編程的企業(yè)級套路+模板 // 1 在高內(nèi)聚 低耦合的前提下, 線程 操作(對外暴露的調(diào)用方法) 資源類 public class SaleTicket {public static void main(String[] args) { // main 一切程序的入口Ticket ticket=new Ticket();//Thread(Runnable target,String name) Allocates a new Thread objectnew Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i <=40 ; i++) {ticket.saleTicket();}}},"A").start();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i <=40 ; i++) {ticket.saleTicket();}}},"B").start();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i <=40 ; i++) {ticket.saleTicket();}}},"C").start();} }synchronized? 是一個重量級的鎖
Lock 是什么??
?
使用 Lock,而不使用 synchronized? 的原因是因為:縮小鎖的粒度范圍
package com.dym.juc;import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;//資源類 class Ticket {private int number =30;private Lock lock=new ReentrantLock();public void saleTicket(){lock.lock();try{if(number>0){System.out.println(Thread.currentThread().getName()+"\t賣出第:"+(number--)+"\t還剩下:"+number);}}finally{lock.unlock();}} }//題目:三個售票員 賣出 30張票 // 多線程編程的企業(yè)級套路+模板 // 1 在高內(nèi)聚 低耦合的前提下, 線程 操作(對外暴露的調(diào)用方法) 資源類 public class SaleTicket {public static void main(String[] args) { // main 一切程序的入口Ticket ticket=new Ticket();//Thread(Runnable target,String name) Allocates a new Thread objectnew Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i <=40 ; i++) {ticket.saleTicket();}}},"A").start();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i <=40 ; i++) {ticket.saleTicket();}}},"B").start();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i <=40 ; i++) {ticket.saleTicket();}}},"C").start();} }synchronized與Lock的區(qū)別?
1.首先synchronized是java內(nèi)置關(guān)鍵字,在jvm層面,Lock是個java類;
2.synchronized無法判斷是否獲取鎖的狀態(tài),Lock可以判斷是否獲取到鎖;
3.synchronized會自動釋放鎖(a 線程執(zhí)行完同步代碼會釋放鎖 ;b 線程執(zhí)行過程中發(fā)生異常會釋放鎖),Lock需在finally中手工釋放鎖(unlock()方法釋放鎖),否則容易造成線程死鎖;
4.用synchronized關(guān)鍵字的兩個線程1和線程2,如果當(dāng)前線程1獲得鎖,線程2線程等待。如果線程1阻塞,線程2則會一直等待下去,而Lock鎖就不一定會等待下去,如果嘗試獲取不到鎖,線程可以不用一直等待就結(jié)束了;
5.synchronized的鎖不可重入、不可中斷、非公平,而Lock鎖可重入、可判斷、可公平(兩者皆可)
6.Lock鎖適合大量同步的代碼的同步問題,synchronized鎖適合代碼少量的同步問題。
總結(jié)
以上是生活随笔為你收集整理的题目:三个售票员 卖出 30张票 || 多线程编程的企业级套路+模板||synchronized与Lock的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IntelliJ IDEA 的安装、配置
- 下一篇: lambda表达式的使用 || Lamb