java同步鎖的正確使用方法(必看篇)
同步鎖分類(lèi)
對(duì)象鎖(this)
類(lèi)鎖(類(lèi)的字節(jié)碼文件對(duì)象即類(lèi)名.class)
字符串鎖(比較特別)
應(yīng)用場(chǎng)景
在多線程下對(duì)共享資源的安全操作。
需求:?jiǎn)?dòng)5個(gè)線程對(duì)共享資源total進(jìn)行安全操作。
同步鎖在多線程單例模式下的使用
以上三類(lèi)同步鎖都可以。
package cn.myThread;
public class MyThread implements Runnable {
private static int total = 10;
@Override
public void run() {
synchronized (this){ //使用this對(duì)象鎖
//synchronized (MyThread.class){ //使用MyThread.class類(lèi)鎖
//synchronized (""){//使用字符串鎖
System.out.println(Thread.currentThread().getName() + "正在運(yùn)行");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
total--;
System.out.println(total);
System.out.println(Thread.currentThread().getName() + "線程結(jié)束");
}
}
}
package cn.test;
import cn.myThread.MyThread;
public class TestMyThread {
public static void main(String[] args){
MyThread myThread = new MyThread();
Thread thread = null;
for (int i = 1 ; i <= 5 ; i++){
thread = new Thread(myThread,"線程"+i); //開(kāi)啟5個(gè)線程,傳入同一個(gè)對(duì)象
thread.start();
}
}
}
線程1正在運(yùn)行
9
線程1線程結(jié)束
線程3正在運(yùn)行
8
線程3線程結(jié)束
線程5正在運(yùn)行
7
線程5線程結(jié)束
線程2正在運(yùn)行
6
線程2線程結(jié)束
線程4正在運(yùn)行
5
線程4線程結(jié)束
分析:從運(yùn)行結(jié)果可以看出5個(gè)線程串行執(zhí)行同步鎖里面的代碼,因?yàn)?個(gè)線程中的同步鎖對(duì)象this指向同一個(gè)的對(duì)象(同步鎖對(duì)象MyThread.class類(lèi)鎖是同一個(gè)對(duì)象、同步鎖對(duì)象 ”” 字符串鎖是同一個(gè)對(duì)象),所以5個(gè)線程會(huì)串行執(zhí)行同步鎖里面的代碼。
同步鎖在多線程多例模式下的使用
錯(cuò)誤用法
package cn.myThread;
public class MyThread implements Runnable {
private static int total = 10;
@Override
public void run() {
synchronized (this){//使用this對(duì)象鎖
System.out.println(Thread.currentThread().getName() + "正在運(yùn)行");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
total--;
System.out.println(total);
System.out.println(Thread.currentThread().getName() + "線程結(jié)束");
}
}
}
package cn.test;
import cn.myThread.MyThread;
public class TestMyThread {
public static void main(String[] args){
Thread thread = null;
for (int i = 1 ; i <= 5 ; i++){
thread = new Thread(new MyThread(),"線程"+i);//開(kāi)啟5個(gè)線程,傳入5個(gè)不同對(duì)象
thread.start();
}
}
}
線程2正在運(yùn)行
線程1正在運(yùn)行
線程3正在運(yùn)行
線程5正在運(yùn)行
線程4正在運(yùn)行
9
7
9
8
線程1線程結(jié)束
線程5線程結(jié)束
線程2線程結(jié)束
線程3線程結(jié)束
6
線程4線程結(jié)束
分析:從運(yùn)行結(jié)果可以看出5個(gè)線程并行執(zhí)行同步鎖里面的代碼,因?yàn)?個(gè)線程中的同步鎖對(duì)象this指向5個(gè)不同的對(duì)象,所以5個(gè)線程會(huì)同時(shí)執(zhí)行同步鎖里面的代碼。
正確用法
方式一:
package cn.myThread;
public class MyThread implements Runnable {
private static int total = 10;
@Override
public void run() {
synchronized (MyThread.class){//使用MyThread.class類(lèi)鎖
System.out.println(Thread.currentThread().getName() + "正在運(yùn)行");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
total--;
System.out.println(total);
System.out.println(Thread.currentThread().getName() + "線程結(jié)束");
}
}
}
package cn.test;
import cn.myThread.MyThread;
public class TestMyThread {
public static void main(String[] args){
Thread thread = null;
for (int i = 1 ; i <= 5 ; i++){
thread = new Thread(new MyThread(),"線程"+i); //開(kāi)啟5個(gè)線程,傳入5個(gè)不同對(duì)象
thread.start();
}
}
}
線程1正在運(yùn)行
9
線程1線程結(jié)束
線程5正在運(yùn)行
8
線程5線程結(jié)束
線程4正在運(yùn)行
7
線程4線程結(jié)束
線程3正在運(yùn)行
6
線程3線程結(jié)束
線程2正在運(yùn)行
5
線程2線程結(jié)束
分析:從運(yùn)行結(jié)果可以看出5個(gè)線程串行執(zhí)行同步鎖里面的代碼,因?yàn)?個(gè)線程中的同步鎖對(duì)象MyThread.class類(lèi)鎖是同一個(gè)對(duì)象,所以5個(gè)線程會(huì)串行執(zhí)行同步鎖里面的代碼。
方式二:
package cn.myThread;
public class MyThread implements Runnable {
private static int total = 10;
@Override
public void run() {
synchronized (""){//使用字符串鎖
System.out.println(Thread.currentThread().getName() + "正在運(yùn)行");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
total--;
System.out.println(total);
System.out.println(Thread.currentThread().getName() + "線程結(jié)束");
}
}
}
package cn.test;
import cn.myThread.MyThread;
public class TestMyThread {
public static void main(String[] args){
Thread thread = null;
for (int i = 1 ; i <= 5 ; i++){
thread = new Thread(new MyThread(),"線程"+i); //開(kāi)啟5個(gè)線程,傳入5個(gè)不同對(duì)象
thread.start();
}
}
}
線程1正在運(yùn)行
9
線程1線程結(jié)束
線程4正在運(yùn)行
8
線程4線程結(jié)束
線程5正在運(yùn)行
7
線程5線程結(jié)束
線程3正在運(yùn)行
6
線程3線程結(jié)束
線程2正在運(yùn)行
5
線程2線程結(jié)束
分析:從運(yùn)行結(jié)果可以看出5個(gè)線程串行執(zhí)行同步鎖里面的代碼,因?yàn)?個(gè)線程中的同步鎖對(duì)象 ”” 字符串鎖是同一個(gè)對(duì)象,所以5個(gè)線程會(huì)串行執(zhí)行同步鎖里面的代碼。
以上這篇java同步鎖的正確使用方法(必看篇)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Java同步鎖Synchronized底層源碼和原理剖析(推薦)
- 95%的Java程序員人都用不好Synchronized詳解
- Java?synchronized同步關(guān)鍵字工作原理
- Java synchronized偏向鎖的概念與使用
- Java?synchronized輕量級(jí)鎖實(shí)現(xiàn)過(guò)程淺析
- Java synchronized重量級(jí)鎖實(shí)現(xiàn)過(guò)程淺析
- Java @Transactional與synchronized使用的問(wèn)題
- Java?synchronized與死鎖深入探究
- Java synchronized與CAS使用方式詳解
- 淺析Java關(guān)鍵詞synchronized的使用
- synchronized及JUC顯式locks?使用原理解析
- java鎖synchronized面試常問(wèn)總結(jié)
- Java?HashTable與Collections.synchronizedMap源碼深入解析
- Java?Synchronized鎖的使用詳解
- AQS加鎖機(jī)制Synchronized相似點(diǎn)詳解
- Java必會(huì)的Synchronized底層原理剖析
- 一個(gè)例子帶你看懂Java中synchronized關(guān)鍵字到底怎么用
- 詳解Java?Synchronized的實(shí)現(xiàn)原理
- Synchronized?和?ReentrantLock?的實(shí)現(xiàn)原理及區(qū)別
- Java同步鎖synchronized用法的最全總結(jié)
相關(guān)文章
解決Maven靜態(tài)資源過(guò)濾問(wèn)題
在我們使用Maven構(gòu)建項(xiàng)目的時(shí)候,會(huì)默認(rèn)過(guò)濾掉靜態(tài)資源,所以,需要手動(dòng)來(lái)配置,本文就介紹一下Maven靜態(tài)資源過(guò)濾的問(wèn)題解決,感興趣的可以了解一下2021-06-06
SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源
在某些情況下,如果我們需要配置多個(gè)數(shù)據(jù)源,本文主要介紹了SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
詳解springboot+aop+Lua分布式限流的最佳實(shí)踐
這篇文章主要介紹了詳解springboot+aop+Lua分布式限流的最佳實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Intellij IDEA中一次性折疊所有Java代碼的快捷鍵設(shè)置
這篇文章主要介紹了Intellij IDEA中一次性折疊所有Java代碼的快捷鍵設(shè)置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
spring boot使用properties定義短信模板的方法教程
這篇文章主要給大家介紹了關(guān)于spring boot使用properties定義短信模板的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
走進(jìn)SpringBoot之配置文件與多環(huán)境詳解
這篇文章主要介紹了走進(jìn)SpringBoot之配置文件與多環(huán)境,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05

