Java多線程之同步鎖-lock詳解
一、題目描述
題目:
同步鎖出現(xiàn)的目的就是為了解決多線程安全問題。
同步鎖的幾種方式
synchronized
1、同步代碼塊
2、同步方法
jdk1.5后
3、lock鎖:用lock()上鎖,unlock()釋放鎖
實現(xiàn):重現(xiàn)窗口售票多線程問題,并用lock鎖解決。
二、解題思路
重現(xiàn)窗口售票多線程問題:
新創(chuàng)建類:LockDemo1
在main方法中,新創(chuàng)建三個線程,一起啟動這三個線程。
新創(chuàng)建內(nèi)部類:Ticket , Ticket implements Runnable
Ticket中每0.2秒賣一張票,用--i
使用lock鎖:
新創(chuàng)建類:LockDemo2
在main方法中,新創(chuàng)建三個線程,一起啟動這三個線程。
新創(chuàng)建內(nèi)部類:Ticket , Ticket implements Runnable
在這段邏輯之前上鎖,邏輯結(jié)束后釋放鎖 要把釋放鎖放在finally里
Ticket中每0.2秒賣一張票,用--i
lock鎖相比于synchronized的好處是 靈活 ,可由研發(fā)人員自行控制加鎖和解鎖的時機。
三、代碼詳解
LockDemo1
/**
* Description: 重現(xià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號窗口").start();
new Thread(ticket, "2號窗口").start();
new Thread(ticket, "3號窗口").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)多線程問題:

LockDemo2
public class LockDemo2 {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(ticket, "1號窗口").start();
new Thread(ticket, "2號窗口").start();
new Thread(ticket, "3號窗口").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多線程之同步鎖-lock詳解的文章就介紹到這了,更多相關(guān)Java同步鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳細(xì)總結(jié)Java創(chuàng)建文件夾的方法及優(yōu)缺點
很多小伙伴都不知道如何用Java創(chuàng)建文件夾,今天給大家整理了這篇文章,文中有非常詳細(xì)的方法介紹及方法的優(yōu)缺點,對正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05
SpringBoot實現(xiàn)國際化(多語言)配置的詳細(xì)步驟
SpringBoot 國際化配置是實現(xiàn)應(yīng)用程序支持多語言的功能,這對于全球化的網(wǎng)站和應(yīng)用來說至關(guān)重要,SpringBoot 提供了簡潔的機制來實現(xiàn)這一目標(biāo),本文通過代碼示例和圖文介紹的非常詳細(xì),需要的朋友可以參考下2025-09-09
Java使用Callable和Future創(chuàng)建線程操作示例
這篇文章主要介紹了Java使用Callable和Future創(chuàng)建線程操作,結(jié)合實例形式分析了java使用Callable接口和Future類創(chuàng)建線程的相關(guān)操作技巧與注意事項,需要的朋友可以參考下2019-09-09
Springboot項目通過redis實現(xiàn)接口的冪等性
這篇文章主要為大家介紹了Springboot項目通過redis實現(xiàn)接口的冪等性,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
Java 8 開發(fā)的 Mybatis 注解代碼生成工具
MybatisAnnotationTools 是基于 Java8 開發(fā)的一款可以用于自動化生成 MyBatis 注解類的工具,支持配置數(shù)據(jù)源、類路徑,表名去前綴、指定類名前后綴等功能.這篇文章主要介紹了Java 8 開發(fā)的 Mybatis 注解代碼生成工具 ,需要的朋友可以參考下2019-07-07
Java實戰(zhàn)之晚會抽獎系統(tǒng)的實現(xiàn)
這篇文章主要介紹了如何利用Java語言編寫一個晚會抽獎系統(tǒng),文中采用到的技術(shù)有Jdbc、Servlert、JavaScript、JQuery、Ajax等,感興趣的可以學(xué)習(xí)一下2022-03-03

