亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁技術文章
文章詳情頁

Java實現(xiàn)線程同步方法及原理詳解

瀏覽:29日期:2022-08-31 17:03:52

一、概述

無論是什么語言,在多線程編程中,常常會遇到多個線同時操作程某個變量(讀/寫),如果讀/寫不同步,則會造成不符合預期的結果。

例如:線程A和線程B并發(fā)運行,都操作變量X,若線程A對變量X進行賦上一個新值,線程B仍然使用變量X之前的值,很明顯線程B使用的X不是我們想要的值了。

Java提供了三種機制,解決上述問題,實現(xiàn)線程同步:

同步代碼塊

synchronized(鎖對象){// 這里添加受保護的數(shù)據(jù)操作}

同步方法

靜態(tài)同步方法:synchronized修飾的靜態(tài)方法,它的同步鎖是當前方法所在類的字節(jié)碼對象

public static synchronized void staticMethod(){}

非靜態(tài)同步方法:synchronized修飾的非靜態(tài)方法,它的同步鎖即為this

public synchronize void method(){}

鎖機制

// 以可重入鎖舉例Lock lock = new ReentrantLock(/*fail*/); // fail: // true表示使用公平鎖,即線程等待拿到鎖的時間越久,越容易拿到鎖// false表示使用非公平鎖,線程拿到鎖全靠運氣。。。cpu時間片輪到哪個線程,哪個線程就能獲取鎖lock.lock();// 這里添加受保護的數(shù)據(jù)操作lock.unlock();

個人理解:其實無論哪種機制實現(xiàn)線程同步,本質上都是加鎖->操作數(shù)據(jù)->解鎖的過程。同步代碼塊是針對{}中,同步方法是針對整個方法。其ReentrantLock類提供的lock和unlock和C++的std::mutex提供lock和unlock類似

二、測試用例

Java實現(xiàn)線程同步方法及原理詳解

同步代碼塊測試類

package base.synchronize;public class SynchronizeBlock implements Runnable { private int num = 100; @Override public void run() { while (num > 1) { synchronized (this) {// 同步代碼塊,只有拿到鎖,才有cpu執(zhí)行權System.out.println('Thread ID:' + Thread.currentThread().getId() + '---num:' + num);num--; } } System.out.println('Thread ID:' + Thread.currentThread().getId() + ' exit'); }}

同步方法測試類

package base.synchronize;public class SynchronizeMethod implements Runnable { private int num = 100; public static int staticNum = 100; boolean useStaticMethod; public SynchronizeMethod(boolean useStaticMethodToTest) { this.useStaticMethod = useStaticMethodToTest; } // 對于非靜態(tài)方法,同步鎖對象即this public synchronized void method() { System.out.println('Thread ID:' + Thread.currentThread().getId() + '---num:' + num); num--; } // 對于靜態(tài)方法,同步鎖對象是當前方法所在類的字節(jié)碼對象 public synchronized static void staticMethod() { System.out.println('Static Method Thread ID:' + Thread.currentThread().getId() + '---num:' + staticNum); staticNum--; } @Override public void run() { if (useStaticMethod) { // 測試靜態(tài)同步方法 while (staticNum > 1) {staticMethod(); } }else{ // 測試非靜態(tài)同步方法 while (num > 1){method(); } } System.out.println('Thread ID:' + Thread.currentThread().getId() + ' exit'); }}

ReentrantLock測試類

package base.synchronize;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class SynchronizeLock implements Runnable { private Lock lock = null; private int num = 100; public SynchronizeLock(boolean fair){ lock = new ReentrantLock(fair); // 可重入鎖 } @Override public void run() { while (num > 1) { try {lock.lock();System.out.println('Thread ID:' + Thread.currentThread().getId() + '---num:' + num);num--; } catch (Exception e) {e.printStackTrace(); }finally {lock.unlock(); } } System.out.println('Thread ID:' + Thread.currentThread().getId() + ' exit'); }}

測試三種機制的Demo

package base.synchronize;public class Demo { public static void main(String[] args) { synchronizeBlockTest(); // 同步代碼塊 synchronizeMethodTest(); // 同步非靜態(tài)方法 synchronizeStaticMethodTest(); // 同步靜態(tài)方法 synchronizeLockTest(); // 可重入鎖機制 } public static void synchronizeBlockTest(){ Runnable run = new SynchronizeBlock(); for(int i = 0; i < 3; i++){ new Thread(run).start(); } } public static void synchronizeMethodTest(){ Runnable run = new SynchronizeMethod(false); for(int i = 0; i < 3; i++){ new Thread(run).start(); } } public static void synchronizeStaticMethodTest() { Runnable run = new SynchronizeMethod(true); for(int i = 0; i < 3; i++){ new Thread(run).start(); } } public static void synchronizeLockTest(){ Runnable run = new SynchronizeLock(false); // true:使用公平鎖 false:使用非公平鎖 for(int i = 0; i < 3; i++){ new Thread(run).start(); } }}

無論哪種機制,都得到預期的效果,打印100-0

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 午夜一区二区福利视频在线 | 欧美日韩另类国产 | 大片毛片女女女女女女女 | 爽爽爽爽爽爽爽成人免费观看 | 欧洲免费无线码二区5 | 国产免费一级视频 | 国产欧美日韩综合精品一区二区 | 国产精品久久久久无码av | 亚洲精品久久一区二区无卡 | 精品一区二区三区免费毛片爱 | 亚洲一级毛片免费在线观看 | 最新在线精品国自拍视频 | 亚洲欧美卡通动漫丝袜美腿 | 草久久久久 | 午夜视频在线观看一区 | 91精品国产高清久久久久久io | 国产一区中文字幕在线观看 | 欧美成视频无需播放器 | 欧美日韩精品一区二区三区 | 亚洲欧美日韩视频一区 | 亚洲精品久久一区毛片 | 国产成人精品免费视频软件 | 日韩中文字幕在线看 | 在线观看91精品国产入口 | 免费日韩在线视频 | 国产精品久久精品视 | 真实国产乱子伦高清 | 国产二区三区 | 久久久综合久久 | 欧美a大片欧美片 | 成人爽a毛片在线视频 | 亚洲特级毛片 | 免费视频成人 | 国产精品久久久久a影院 | 图片区偷拍区小说区 | 色偷偷亚洲第一成人综合网址 | 成年人网站在线 | 2019偷偷狠狠的日日 | 精品久久久久久中文字幕一区 | 欧美一区二区三区在线视频 | 最新国产成人综合在线观看 |