题目:三个售票员 卖出 30张票 || 多线程编程的企业级套路+模板||synchronized与Lock的区别
生活随笔
收集整理的這篇文章主要介紹了
题目:三个售票员 卖出 30张票 || 多线程编程的企业级套路+模板||synchronized与Lock的区别
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
package com.dym.juc;//資源類 class Ticket {private int number =30;public synchronized void saleTicket(){if(number>0){System.out.println(Thread.currentThread().getName()+"\t賣(mài)出第:"+(number--)+"\t還剩下:"+number);}}}//題目:三個(gè)售票員 賣(mài)出 30張票 // 多線程編程的企業(yè)級(jí)套路+模板 // 1 在高內(nèi)聚 低耦合的前提下, 線程 操作(對(duì)外暴露的調(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? 是一個(gè)重量級(jí)的鎖
Lock 是什么??
?
使用 Lock,而不使用 synchronized? 的原因是因?yàn)?#xff1a;縮小鎖的粒度范圍
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賣(mài)出第:"+(number--)+"\t還剩下:"+number);}}finally{lock.unlock();}} }//題目:三個(gè)售票員 賣(mài)出 30張票 // 多線程編程的企業(yè)級(jí)套路+模板 // 1 在高內(nèi)聚 低耦合的前提下, 線程 操作(對(duì)外暴露的調(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是個(gè)java類;
2.synchronized無(wú)法判斷是否獲取鎖的狀態(tài),Lock可以判斷是否獲取到鎖;
3.synchronized會(huì)自動(dòng)釋放鎖(a 線程執(zhí)行完同步代碼會(huì)釋放鎖 ;b 線程執(zhí)行過(guò)程中發(fā)生異常會(huì)釋放鎖),Lock需在finally中手工釋放鎖(unlock()方法釋放鎖),否則容易造成線程死鎖;
4.用synchronized關(guān)鍵字的兩個(gè)線程1和線程2,如果當(dāng)前線程1獲得鎖,線程2線程等待。如果線程1阻塞,線程2則會(huì)一直等待下去,而Lock鎖就不一定會(huì)等待下去,如果嘗試獲取不到鎖,線程可以不用一直等待就結(jié)束了;
5.synchronized的鎖不可重入、不可中斷、非公平,而Lock鎖可重入、可判斷、可公平(兩者皆可)
6.Lock鎖適合大量同步的代碼的同步問(wèn)題,synchronized鎖適合代碼少量的同步問(wèn)題。
總結(jié)
以上是生活随笔為你收集整理的题目:三个售票员 卖出 30张票 || 多线程编程的企业级套路+模板||synchronized与Lock的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IntelliJ IDEA 的安装、配置
- 下一篇: 线程的状态 Thread.State||