如何實(shí)現(xiàn)Java線程安全問題
這篇文章主要介紹了如何實(shí)現(xiàn)Java線程安全問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
解決線程安全問題的第一種方案:使用同步代碼塊
格式:
synchronized(鎖對(duì)象) {
可能會(huì)出現(xiàn)線程安全問題的代碼(訪問了共享數(shù)據(jù)的代碼)
}
注意:代碼塊中的鎖對(duì)象,可以是任意對(duì)象,但必須保證多個(gè)線程之間使用的是同一個(gè)
鎖對(duì)象的作用是把同步代碼塊鎖住,同一時(shí)間只能讓一個(gè)線程在同步代碼塊中執(zhí)行
package com.fgy.demo02; /** * 實(shí)現(xiàn)賣票案例 */ public class RunnableImpl implements Runnable { private int ticket = 100; Object obj = new Object(); @Override public void run() { while (true) { synchronized (obj) { if (ticket > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在買第" + ticket + "張票"); ticket--; } } } } }
package com.fgy.demo02; public class Demo01Ticket { public static void main(String[] args) { RunnableImpl run = new RunnableImpl(); new Thread(run).start(); new Thread(run).start(); new Thread(run).start(); } }
解決線程安全問題的第二種方案:使用同步方法
使用步驟:
1.把訪問了共享數(shù)據(jù)的代碼抽取出來,放到一個(gè)方法中
2.在方法上添加synchronized修飾符
格式:
修飾符 synchronized 返回值類型 方法名(...) {
可能會(huì)出現(xiàn)線程安全問題的代碼(訪問了共享數(shù)據(jù)的代碼)
}
同步方法的鎖對(duì)象是:this
靜態(tài)同步方法的鎖對(duì)象不能是this,因?yàn)閠his是創(chuàng)建對(duì)象后產(chǎn)生的,靜態(tài)方法優(yōu)先于對(duì)象
靜態(tài)方法的鎖對(duì)象是本類的class文件對(duì)象
package com.fgy.demo03; /** * 實(shí)現(xiàn)賣票案例 */ public class RunnableImpl implements Runnable { private int ticket = 100; @Override public void run() { while (true) { payTicket(); } } public synchronized void payTicket() { if (ticket > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在買第" + ticket + "張票"); ticket--; } } }
解決線程安全問題的第三種方案:使用lock鎖
使用步驟:
1.在成員位置創(chuàng)建ReenterantLock對(duì)象
2.在可能出現(xiàn)安全問題的代碼前調(diào)用Lock接口中的方法lock()獲取鎖
3.在可能出現(xiàn)安全問題的代碼后調(diào)用Lock接口中的方法unlock()釋放鎖
package com.fgy.demo04; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 實(shí)現(xiàn)賣票案例 */ public class RunnableImpl implements Runnable { private int ticket = 100; Lock l = new ReentrantLock(); /*@Override public void run() { while (true) { l.lock(); if (ticket > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在買第" + ticket + "張票"); ticket--; } l.unlock(); } }*/ @Override public void run() { while (true) { l.lock(); if (ticket > 0) { try { Thread.sleep(100); System.out.println(Thread.currentThread().getName() + "正在買第" + ticket + "張票"); ticket--; } catch (InterruptedException e) { e.printStackTrace(); } finally { // 無論程序是否發(fā)生異常都會(huì)釋放鎖 l.unlock(); } } } } }
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:java實(shí)現(xiàn)簡單銀行管理系統(tǒng)
欄 目:Java
下一篇:java讀取xml配置參數(shù)代碼實(shí)例
本文標(biāo)題:如何實(shí)現(xiàn)Java線程安全問題
本文地址:http://mengdiqiu.com.cn/a1/Java/8833.html
您可能感興趣的文章
- 01-10Java實(shí)現(xiàn)動(dòng)態(tài)模擬時(shí)鐘
- 01-10利用Java實(shí)現(xiàn)復(fù)制Excel工作表功能
- 01-10JavaWeb實(shí)現(xiàn)郵件發(fā)送功能
- 01-10java基于poi導(dǎo)出excel透視表代碼實(shí)例
- 01-10Java實(shí)現(xiàn)動(dòng)態(tài)數(shù)字時(shí)鐘
- 01-10基于Java驗(yàn)證jwt token代碼實(shí)例
- 01-10java實(shí)現(xiàn)液晶數(shù)字字體顯示當(dāng)前時(shí)間
- 01-10淺談Java中真的只有值傳遞么
- 01-10Java動(dòng)態(tài)顯示當(dāng)前日期和時(shí)間
- 01-10如何解決線程太多導(dǎo)致java socket連接池出現(xiàn)的問題


閱讀排行
本欄相關(guān)
- 01-10Java實(shí)現(xiàn)動(dòng)態(tài)模擬時(shí)鐘
- 01-10Springboot中@Value的使用詳解
- 01-10JavaWeb實(shí)現(xiàn)郵件發(fā)送功能
- 01-10利用Java實(shí)現(xiàn)復(fù)制Excel工作表功能
- 01-10Java實(shí)現(xiàn)動(dòng)態(tài)數(shù)字時(shí)鐘
- 01-10java基于poi導(dǎo)出excel透視表代碼實(shí)例
- 01-10java實(shí)現(xiàn)液晶數(shù)字字體顯示當(dāng)前時(shí)間
- 01-10基于Java驗(yàn)證jwt token代碼實(shí)例
- 01-10Java動(dòng)態(tài)顯示當(dāng)前日期和時(shí)間
- 01-10淺談Java中真的只有值傳遞么
隨機(jī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery