13.8 线程的安全问题和解决方法
生活随笔
收集整理的這篇文章主要介紹了
13.8 线程的安全问题和解决方法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
package cn.chen.threadsecurity;
/*
出現(xiàn)線程安全問題的原因:1.存在兩個或兩個以上的線程對象,而且線程之間共享一個資源。2.有多個語句操作了共享資源。java線程同步機制:方式一:同步代碼塊:同步代碼塊的格式:synchronize(鎖對象){需要被同步的代碼。}注意事項:1.任意一個對象都可以做為一個鎖對象,例如 static Object o = new Object();2.在同步代碼塊中調(diào)用了sleep方法,在此過程中并不會釋放鎖3.只有真正存在線程安全問題的時候才使用同步代碼塊,否則會降低效率。4.多線程操作 的鎖對象 必須是唯一共享的 ,否則無效。方式二:同步函數(shù):后面介紹
*/
class SaleTicket extends Thread{//設(shè)置num為靜態(tài)的 //票數(shù),非靜態(tài)的成員變量,非靜態(tài)的成員變量數(shù)據(jù)是在每個對象中都會維護一份數(shù)據(jù)。static int num = 10 ; static Object o = new Object();//鎖對象public SaleTicket(String name){super(name);}@Overridepublic void run() {// TODO Auto-generated method stubsuper.run();while(true){synchronized (o) {if(num > 0){System.out.println(Thread.currentThread().getName()+" 剩余 " +num+"號票");num--;try{sleep(100);}catch (InterruptedException e){e.printStackTrace();}}else{System.out.println("售罄");break;}}}}}
public class Demo {public static void main(String[] args) {// TODO Auto-generated method stub//創(chuàng)建三個線程,模擬窗口SaleTicket s1 = new SaleTicket("窗口1");SaleTicket s2 = new SaleTicket("窗口2");SaleTicket s3 = new SaleTicket("窗口3");s1.start();s2.start();s3.start();}}
總結(jié)
以上是生活随笔為你收集整理的13.8 线程的安全问题和解决方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 13.7 线程生命周期状态图、线程常用的
- 下一篇: 14.1 线程回顾和同步函数