日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java中的线程不安全和实例解析

發布時間:2023/12/4 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中的线程不安全和实例解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一:引言(特指單核)

所謂線程不安全,就是在共享數據時,不同的線程在執行時,出現數據的不準確,(以模擬搶票和模擬銀行取錢為例),那么我們的線程不安全具體指的是什么呢?是指我們的一個線程還未來結束,就被cpu時間切片切換到其他線程了,最終會導致我們的數據不準確

二:實例分析

1.搶票

package com.wyj.three; /** * * 線程不安全:出現負數,和相等的票數 * * @author 86155 * */ public class Demo1_線程不安全示例一 {public static void main(String[] args) {// TODO Auto-generated method stub//同一個資源son3 p = new son3();System.out.println(Thread.currentThread().getName());//獲取當前線程的名字//多個代理new Thread(p,"王小杰").start();new Thread(p,"王中杰").start();new Thread(p,"王大杰").start();}}class son3 implements Runnable{private int ticketnums = 10;@Overridepublic void run() {// TODO Auto-generated method stubwhile(true) {if(this.ticketnums < 0)break;try {Thread.sleep(1000);//模擬網絡延遲 } catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.err.println(Thread.currentThread().getName()+"--->"+ticketnums--);}}}

分析:

這里的出現負數和相同的數就是我們的線程不安全,出現負數,那是因為3個人在搶最后一張票時,都在通過sleep(),進入阻塞狀態,也就是線程被中斷了,cpu時間切片,切換到其他線程執行了,那么等待阻塞狀態結束,就如就緒狀態,待cpu調度是,繼續執行sleep()下面的代碼,這是就會出現問題,第一個人阻塞狀態結束后,可能會搶到票,那么接下來的人,阻塞狀態結束后,繼續執行sleep()下面的代碼,因為是共享資源,唯一一張票已經被搶走了,剩下0,再來一個那就-1;
對于出現相等的票,那是1個人待阻塞結束后,從主存中拷貝原來的進度數據,但這時cpu時間切片還未切換到他,這是又有一個人從主存當中拷貝了數據,數據沒變化,那當cpu調度到的時候就會出現相同的票**

2:實例二銀行取錢

package com.wyj.three; /*** 所謂線程不安全 就是發生在 共享資源上 * 銀行取錢 兩個線程在執行完 取錢的之后cpu時間片就切換了 就是一個線程還未執行完 就切換到另一個了,這樣的話* 賬戶連續兩次的取錢80,也就是剩下的錢為-60 當cpu時間切片切換回來時,余額就為-60;* * * @author 86155**/ public class Demo2_線程不安全示例二 {public static void main(String[] args) {//開個賬戶Account a = new Account(100, "結婚禮金");Drawing t1 = new Drawing(a,80, "me");Drawing t2 = new Drawing(a, 80, "wife");t1.start();t2.start();} }//賬戶 class Account{int money;String name;public Account(int money, String name) {super();this.money = money;this.name = name;} }//取款 class Drawing extends Thread{Account account;//取錢的賬戶;int getmoney;//取得錢int summoney;//取得總數public Drawing(Account account, int getmoney,String name) {super(name);this.account = account;this.getmoney = getmoney;}public void run() {// if((account.money-=getmoney) < 0) // return ; // // try { // Thread.sleep(1000); // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // }account.money-=getmoney;summoney+=getmoney;System.out.println(this.getName()+"-->賬戶余額:"+account.money);System.out.println(this.getName()+"-->到手的錢:"+summoney);}}

分析:

銀行取錢 兩個線程在執行完 取錢的之后cpu時間片就切換了 就是一個線程還未執行完 就切換到另一個了,這樣的話
賬戶連續兩次的取錢80,也就是剩下的錢為-60 當cpu時間切片切換回來時,余額就為-60;

三:總結

歸根到底這些問題都是線程不同步導致的, 就是一個線程還未結束,就開始另外一個線程,在共享資源的背景下肯定會出現數據錯誤

如有疑問請留言呀

總結

以上是生活随笔為你收集整理的java中的线程不安全和实例解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。