Java多線(xiàn)程之同步鎖-lock詳解
一、題目描述
題目:
同步鎖出現(xiàn)的目的就是為了解決多線(xiàn)程安全問(wèn)題。
同步鎖的幾種方式
synchronized
1、同步代碼塊
2、同步方法
jdk1.5后
3、lock鎖:用lock()上鎖,unlock()釋放鎖
實(shí)現(xiàn):重現(xiàn)窗口售票多線(xiàn)程問(wèn)題,并用lock鎖解決。
二、解題思路
重現(xiàn)窗口售票多線(xiàn)程問(wèn)題:
新創(chuàng)建類(lèi):LockDemo1
在main方法中,新創(chuàng)建三個(gè)線(xiàn)程,一起啟動(dòng)這三個(gè)線(xiàn)程。
新創(chuàng)建內(nèi)部類(lèi):Ticket , Ticket implements Runnable
Ticket中每0.2秒賣(mài)一張票,用--i
使用lock鎖:
新創(chuàng)建類(lèi):LockDemo2
在main方法中,新創(chuàng)建三個(gè)線(xiàn)程,一起啟動(dòng)這三個(gè)線(xiàn)程。
新創(chuàng)建內(nèi)部類(lèi):Ticket , Ticket implements Runnable
在這段邏輯之前上鎖,邏輯結(jié)束后釋放鎖 要把釋放鎖放在finally里
Ticket中每0.2秒賣(mài)一張票,用--i
lock鎖相比于synchronized的好處是 靈活 ,可由研發(fā)人員自行控制加鎖和解鎖的時(shí)機(jī)。
三、代碼詳解
LockDemo1
/**
* Description: 重現(xiàn)窗口售票多線(xiàn)程問(wèn)題
*
* @author xiaoxuzhu
* @version 1.0
*
* <pre>
* 修改記錄:
* 修改后版本 修改人 修改日期 修改內(nèi)容
* 2022/5/15.1 xiaoxuzhu 2022/5/15 Create
* </pre>
* @date 2022/5/15
*/
public class LockDemo1 {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(ticket, "1號(hào)窗口").start();
new Thread(ticket, "2號(hào)窗口").start();
new Thread(ticket, "3號(hào)窗口").start();
}
static class Ticket implements Runnable {
private int tick = 100;
@Override
public void run() {
while (true) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (tick > 0) {
System.out.println(Thread.currentThread().getName() + "完成售票,余票是:" + --tick);
}
}
}
}
}出現(xiàn)多線(xiàn)程問(wèn)題:

LockDemo2
public class LockDemo2 {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(ticket, "1號(hào)窗口").start();
new Thread(ticket, "2號(hào)窗口").start();
new Thread(ticket, "3號(hào)窗口").start();
}
static class Ticket implements Runnable {
private int tick = 100;
//創(chuàng)建鎖
private Lock lock = new ReentrantLock();
@Override
public void run() {
while (true) {
//上鎖
lock.lock();
try {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (tick > 0) {
System.out.println(Thread.currentThread().getName() + "完成售票,余票是:" + --tick);
}
}finally {
lock.unlock();
}
}
}
}
}

到此這篇關(guān)于Java多線(xiàn)程之同步鎖-lock詳解的文章就介紹到這了,更多相關(guān)Java同步鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java并發(fā)之串行線(xiàn)程池實(shí)例解析
這篇文章主要介紹了Java并發(fā)之串行線(xiàn)程池實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
postman中實(shí)現(xiàn)傳遞@RequestBody參數(shù)
這篇文章主要介紹了postman中實(shí)現(xiàn)傳遞@RequestBody參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Spring中ApplicationEventPublisher發(fā)布訂閱模式的實(shí)現(xiàn)
本文主要介紹了Spring中ApplicationEventPublisher發(fā)布訂閱模式的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Java實(shí)現(xiàn)鎖定某個(gè)變量的幾種方式示例詳解
這篇文章主要為大家介紹了Java實(shí)現(xiàn)鎖某個(gè)變量的幾種方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Java中@DS+@Transactional注解切換數(shù)據(jù)源失效解決方案
本文主要介紹了@DS+@Transactional注解切換數(shù)據(jù)源失效解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Jenkins自動(dòng)部署SpringBoot項(xiàng)目實(shí)踐教程
這篇文章主要介紹了Jenkins自動(dòng)部署SpringBoot項(xiàng)目實(shí)踐教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11

