多个线程直接按对数据进行操作容易引发线程安全问题
生活随笔
收集整理的這篇文章主要介紹了
多个线程直接按对数据进行操作容易引发线程安全问题
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
參考鏈接:http://www.cnblogs.com/paddix/p/5374810.html
代碼:
public class Count {public int num;public void add(){for(int i =0;i < 10;i++){num++;}System.out.println(Thread.currentThread().getName()+"-" +num);}} public class MyThreadTest {public static void main(String[] args){Count count = new Count();for(int i =0;i<10;i++){new Thread(new Runnable() {@Overridepublic void run() {try {/增加線程的并發(fā)性Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}count.add();}}).start();}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(count.num);} }
結(jié)果展示:
Thread-9-80 Thread-7-90 Thread-4-70 Thread-5-70 Thread-2-70 Thread-0-80 Thread-1-70 Thread-6-80 Thread-3-70 Thread-8-70 90以上的代碼原本應(yīng)該等于100,但由于存在線程的問題,10個(gè)線程同時(shí)共享同一個(gè)變量,這樣就容易產(chǎn)生線程安全問題。
原因:線程直接不能直接傳遞數(shù)據(jù),他們之間的交互是通過共享數(shù)據(jù)來實(shí)現(xiàn)。如上述的代碼中,10個(gè)線程共用一個(gè)count對(duì)象,這個(gè)count對(duì)象是在主內(nèi)存中,每個(gè)線程都有自己的線程棧,都是從主存中讀取count對(duì)象的值并復(fù)制過來,然后執(zhí)行完add()方法后,再刷新到主存中,這樣就很容易造成線程安全。
?
轉(zhuǎn)載于:https://www.cnblogs.com/lfdingye/p/7355630.html
總結(jié)
以上是生活随笔為你收集整理的多个线程直接按对数据进行操作容易引发线程安全问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1355: [Baltic2009]Ra
- 下一篇: Android 8.0 运行时权限策略变