溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java線程安全與不安全實(shí)例分析

發(fā)布時(shí)間:2022-01-06 22:22:44 來源:億速云 閱讀:140 作者:iii 欄目:編程語言

本篇內(nèi)容主要講解“Java線程安全與不安全實(shí)例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Java線程安全與不安全實(shí)例分析”吧!

當(dāng)我們查看JDK API的時(shí)候,總會(huì)發(fā)現(xiàn)一些類說明寫著,線程安全或者線程不安全,比如說StringBuilder中,有這么一句,“將StringBuilder 的實(shí)例用于多個(gè)線程是不安全的。如果需要這樣的同步,則建議使用StringBuffer。 ”,那么下面手動(dòng)創(chuàng)建一個(gè)線程不安全的類,然后在多線程中使用這個(gè)類,看看有什么效果。

Count.java:

public class Count {      private int num;      public void count() {          for(int i = 1; i <= 10; i++) {              num += i;          }          System.out.println(Thread.currentThread().getName() + "-" + num);      }  }

在這個(gè)類中的count方法是計(jì)算1一直加到10的和,并輸出當(dāng)前線程名和總和,我們期望的是每個(gè)線程都會(huì)輸出55。

ThreadTest.java:

public class ThreadTest {      public static void main(String[] args) {          Runnable runnable = new Runnable() {              Count count = new Count();              public void run() {                  count.count();              }          };          for(int i = 0; i < 10; i++) {              new Thread(runnable).start();          }      }  }

這里啟動(dòng)了10個(gè)線程,看一下輸出結(jié)果:

Thread-0-55 Thread-1-110 Thread-2-165 Thread-4-220 Thread-5-275 Thread-6-330 Thread-3-385 Thread-7-440 Thread-8-495 Thread-9-550

只有Thread-0線程輸出的結(jié)果是我們期望的,而輸出的是每次都累加的,這里累加的原因以后的博文會(huì)說明,那么要想得到我們期望的結(jié)果,有幾種解決方案:

1. 將Count中num變成count方法的局部變量;

public class Count {      public void count() {          int num = 0;          for(int i = 1; i <= 10; i++) {              num += i;          }          System.out.println(Thread.currentThread().getName() + "-" + num);      }  }

2. 將線程類成員變量拿到run方法中;

public class ThreadTest4 {      public static void main(String[] args) {          Runnable runnable = new Runnable() {              public void run() {                  Count count = new Count();                  count.count();              }          };          for(int i = 0; i < 10; i++) {              new Thread(runnable).start();          }      }  }&nbsp;

3. 每次啟動(dòng)一個(gè)線程使用不同的線程類,不推薦。

上述測試,我們發(fā)現(xiàn),存在成員變量的類用于多線程時(shí)是不安全的,而變量定義在方法內(nèi)是線程安全的。想想在使用struts1時(shí),不推薦創(chuàng)建成員變量,因?yàn)閍ction是單例的,如果創(chuàng)建了成員變量,就會(huì)存在線程不安全的隱患,而struts2是每一次請(qǐng)求都會(huì)創(chuàng)建一個(gè)action,就不用考慮線程安全的問題。

到此,相信大家對(duì)“Java線程安全與不安全實(shí)例分析”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI