Java多線程中的互斥鎖解析
更新時間:2023年09月15日 11:06:07 作者:伊顰伊笑
這篇文章主要介紹了Java多線程中的互斥鎖解析,Java語言中,引入了對象互斥鎖的概念,來保證共享數(shù)據(jù)操作的完整性,每個對象都對應(yīng)于一個可稱為互斥鎖的標(biāo)記,這個標(biāo)記用來保證在任一時刻,只能有一個線程訪問該對象,需要的朋友可以參考下
基本介紹
- Java語言中,引入了對象互斥鎖的概念,來保證共享數(shù)據(jù)操作的完整性。
- 每個對象都對應(yīng)于一個可稱為 “ 互斥鎖 ” 的標(biāo)記,這個標(biāo)記用來保證在任一時刻,只能有一個線程訪問該對象。
- 關(guān)鍵字 synchronized 來與對象的互斥鎖聯(lián)系。當(dāng)某個對象用 synchronized 修飾時,表明該對象在任一時刻只能由一個線程訪問
- 同步的局限性:導(dǎo)致程序的執(zhí)行效率要降低
- 同步方法(非靜態(tài)的)的鎖可以是this,也可以是其他對象(要求是同一個對象)
- 同步方法(靜態(tài)的)的鎖為當(dāng)前類本身。
把 synchronized 寫在代碼塊上
package thread_;
/**
* @Author: Gin
* @Description:
* @Modified By: Gin
* @Date: Created in 16:37 2021/9/27
*/
public class Thread11 {
public static void main(String[] args) {
SellThread04 sellThread04 = new SellThread04();
new Thread(sellThread04).start();
new Thread(sellThread04).start();
new Thread(sellThread04).start();
}
}
class SellThread04 implements Runnable{
private int ticketsNum = 100;
private boolean flag = true;
@Override
public void run() {
while (flag) {
sell();
}
}
/*
1. public synchronized void sell(){} 就是一個同步方法
2. 這時“鎖”在 this 對象上
3. 也可以在代碼塊上寫 synchronized,同步代碼塊,互斥鎖還是在 this 對象上
如下:
*/
public /* synchronized */ void sell(){
synchronized (this) {
if(ticketsNum <= 0){
System.out.println("售票結(jié)束...");
flag = false;
return;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("窗口 " + Thread.currentThread().getName() + " 售票一張, 剩余票數(shù) " + (--ticketsNum));
}
}
}測試操作同一個對象、靜態(tài)方法的鎖的添加
package thread_;
/**
* @Author: Gin
* @Description:
* @Modified By: Gin
* @Date: Created in 16:37 2021/9/27
*/
public class Thread11 {
public static void main(String[] args) {
SellThread04 sellThread04 = new SellThread04();
new Thread(sellThread04).start();
new Thread(sellThread04).start();
new Thread(sellThread04).start();
}
}
class SellThread04 implements Runnable{
private int ticketsNum = 100;
private boolean flag = true;
// 同步方法(非靜態(tài)的)的鎖可以是this,也可以是其他對象(要求是同一個對象)
// new 一個 Object 對象,測試操作同一個對象
Object object = new Object();
// 同步方法(靜態(tài)的)的鎖為當(dāng)前類本身。
public synchronized static void m1(){
System.out.println("m1");
}
// 在靜態(tài)方法中實現(xiàn)一個同步代碼塊
public static void m2(){
synchronized (SellThread04.class) {
System.out.println("m2");
}
}
@Override
public void run() {
while (flag) {
sell();
}
}
/*
1. public synchronized void sell(){} 就是一個同步方法
2. 這時“鎖”在 this 對象上
3. 也可以在代碼塊上寫 synchronized,同步代碼塊,互斥鎖還是在 this 對象上
如下:
*/
public /* synchronized */ void sell(){
synchronized ( /*this*/ object ) { // 測試操作同一個對象
if(ticketsNum <= 0){
System.out.println("售票結(jié)束...");
flag = false;
return;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("窗口 " + Thread.currentThread().getName() + " 售票一張, 剩余票數(shù) " + (--ticketsNum));
}
}
}細節(jié)
同步方法如果沒有使用 static 修飾:默認鎖對象為 this如果方法使用 static 修飾,默認鎖對象:當(dāng)前類.class
到此這篇關(guān)于Java多線程中的互斥鎖解析的文章就介紹到這了,更多相關(guān)Java互斥鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
j2ee mybatis注解@Data,@TableName,@TableField使用方式
這篇文章主要介紹了j2ee mybatis注解@Data,@TableName,@TableField使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
Flink實現(xiàn)往Kafka中多個topic發(fā)送消息
文章介紹了使用Flink 1.13.2 和 Kafka 2.6.2 從Kafka讀取數(shù)據(jù),并根據(jù)邏輯將數(shù)據(jù)分配到不同的topic,提到了需要重寫FlinkKafka的Key序列化器,并加入自定義邏輯以發(fā)送消息到指定的topic,文中還包括了配置Kafka信息和如何連接FlinkKafka的步驟2025-10-10
Eclipse中改變默認的workspace的方法及說明詳解
eclipse中改變默然的workspace的方法有哪幾種呢?接下來腳本之家小編給大家介紹Eclipse中改變默認的workspace的方法及說明,對eclipse改變workspace相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2016-04-04

