成都那家做網(wǎng)站好?競(jìng)價(jià)推廣教程
一、多線程編程模板
線程????????操作? ? ? ? 資源類
高內(nèi)聚? ? ? ? ? ? ? ? ? ? 低耦合
二、實(shí)現(xiàn)步驟
1、創(chuàng)建資源類
2、資源類里創(chuàng)建同步方法、同步代碼塊
三、12306賣票程序
3.1、synchronized實(shí)現(xiàn)
3.1.1、Ticket
/*** @Author : 一葉浮萍?xì)w大海* @Date: 2023/11/20 8:54* @Description: 資源類火車票*/
public class Ticket {private Integer num = 30;public synchronized void saleTicket() {if (num > 0) {System.out.println(Thread.currentThread().getName() + " 賣出第:" + (num--) + "張票,還剩下:" + num + "張票!");}}}
3.1.2、SaleTicketSynchronizedMainApp
/*** @Author : 一葉浮萍?xì)w大海* @Date: 2023/11/20 8:57* @Description: 需求:三個(gè)售票員 賣出 30張票(synchronized實(shí)現(xiàn))* 多線程編程的企業(yè)級(jí)套路 + 模板:在高內(nèi)聚低耦合的前提下,線程操作資源類*/
public class SaleTicketSynchronizedMainApp {public static void main(String[] args) {Ticket ticket = new Ticket();new Thread(() -> {for (int i = 1; i <= 40; i++) {ticket.saleTicket();}}, "A").start();new Thread(() -> {for (int i = 1; i <= 40; i++) {ticket.saleTicket();}}, "B").start();new Thread(() -> {for (int i = 1; i <= 40; i++) {ticket.saleTicket();}}, "C").start();}}
3.1.3、結(jié)果
3.2、Lock實(shí)現(xiàn)
3.2.1、Ticket
/*** @Author : 一葉浮萍?xì)w大海* @Date: 2023/11/20 8:57* @Description: 需求:三個(gè)售票員 賣出 30張票(synchronized實(shí)現(xiàn))* 多線程編程的企業(yè)級(jí)套路 + 模板:在高內(nèi)聚低耦合的前提下,線程操作資源類*/
public class SaleTicketSynchronizedMainApp {public static void main(String[] args) {Ticket ticket = new Ticket();new Thread(() -> {for (int i = 1; i <= 40; i++) {ticket.saleTicket();}}, "A").start();new Thread(() -> {for (int i = 1; i <= 40; i++) {ticket.saleTicket();}}, "B").start();new Thread(() -> {for (int i = 1; i <= 40; i++) {ticket.saleTicket();}}, "C").start();}}
3.2.2、SaleTicketLockMainApp
/*** @Author : 一葉浮萍?xì)w大海* @Date: 2023/11/20 8:57* @Description: 需求:三個(gè)售票員 賣出 30張票(Lock實(shí)現(xiàn))* 多線程編程的企業(yè)級(jí)套路 + 模板:在高內(nèi)聚低耦合的前提下,線程操作資源類*/
public class SaleTicketLockMainApp {public static void main(String[] args) {Ticket ticket = new Ticket();new Thread(() -> {for (int i = 1; i <= 40; i++) {ticket.saleTicket();}}, "AA").start();new Thread(() -> {for (int i = 1; i <= 40; i++) {ticket.saleTicket();}}, "BB").start();new Thread(() -> {for (int i = 1; i <= 40; i++) {ticket.saleTicket();}}, "CC").start();}}
3.2.3、結(jié)果
四、Lock
4.1、概述
4.2、Lock接口的實(shí)現(xiàn)類ReentrantLock
4.3、如何使用ReentrantLock
class X {private final ReentrantLock lock = new ReentrantLock();// ...public void m() {lock.lock(); // block until condition holdstry {// ... method body} finally {lock.unlock()}}}
4.4、synchronized VS Lock
(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)題;