成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關(guān)于Java語言中的線程安全問題

開發(fā) 后端
Java語言是一種支持多線程的語言,它通過同步(互斥)和協(xié)作(等待和喚醒)來完成。這里聊聊同步。

Java語言是一種支持多線程的語言,它通過同步(互斥)和協(xié)作(等待和喚醒)來完成。這里聊聊同步。

線程不安全主要來自于類變量(靜態(tài)變量)和實例變量,前者位于方法區(qū)中,后者位于堆中,都是共享區(qū)域。局部變量是沒有這個問題的,因為它在線程獨有的棧中。先看下面的例子:

 

  1. public class Test implements Runnable {  
  2.  
  3.     private int j;  
  4.  
  5.     public Test() {  
  6.     }  
  7.  
  8.     public void testThreadLocal() {  
  9.         System.out.println(Thread.currentThread().getId()  
  10.                 + ":============================= begin");  
  11.         j = 2;  
  12.         System.out.println(Thread.currentThread().getId() + ":" + j);  
  13.         j = 20;  
  14.         System.out.println(":" + j * 3 + ":");   
  15.         System.out.println(Thread.currentThread().getId()  
  16.                 + ":============================= end");  
  17.     }  
  18.  
  19.     public static void main(String[] args) {  
  20.         Test t = new Test();   
  21.         for (int i = 0; i < 3000; i++) {  
  22.             new Thread(t).start();  
  23.         }  
  24.     }  
  25.  
  26.     @Override 
  27.     public void run() {  
  28.         testThreadLocal();  
  29.     }  
  30. }  
  31.  

 

執(zhí)行這個類的main方法,會出現(xiàn)線程不安全的問題。上面藍色的語句,應(yīng)該打印出:60:,但實際開了3000個線程(為了方便出現(xiàn)不安全的現(xiàn)象)后,會出現(xiàn)下面紅色的:6:

655:============================= end

49:============================= end

:6:

156:============================= end

152:2

:60:

修改main方法,用多個Test對象,結(jié)果也是一樣。

 

  1. public static void main(String[] args) {  
  2.         Test t = new Test();   
  3.         for (int i = 0; i < 3000; i++) {  
  4.             new Thread(new Test() ).start();  
  5.         }  
  6.     }  
  7.  

 

我們保留多個Test對象的做法,在testThreadLocal方法上加一個同步關(guān)鍵字。

 

  1. public synchronized void testThreadLocal() 

結(jié)果沒有用,仍然是不安全的。改成一個Test對象,這下可以了。原因很簡單,synchronized通過在對象上加鎖來實現(xiàn)線程安全。當使用多個Test對象時,僅僅在this對象上加鎖是不行的,要在類(在java中,類仍然通過一個特殊的Class對象來體現(xiàn))上加鎖才行。所以改成:

 

  1. public void testThreadLocal() {  
  2.         synchronized (this.getClass()) {  
  3.             System.out.println(Thread.currentThread().getId()  
  4.                     + ":============================= begin");  
  5.             j = 2;  
  6.             System.out.println(Thread.currentThread().getId() + ":" + j);  
  7.             j = 20;  
  8.             System.out.println(":" + j * 3 + ":");  
  9.             System.out.println(Thread.currentThread().getId()  
  10.                     + ":============================= end");  
  11.         }   
  12.     }  
  13.  
  14.    
  15.  

 

這下可以了。我們再看使用類變量的情況,先把synchronized關(guān)鍵字去掉,恢復(fù)到最初的代碼,然后把實例變量改成類變量。

 

  1. private int j;  
  2.  
  3. private static int j;  

實驗結(jié)果和使用實例變量基本相同,***的不同之處在于,我們可以這樣在類上加鎖了,注意,testThreadLocal方法被改成靜態(tài)方法。

 

  1. public synchronized static void testThreadLocal() {  
  2.  
  3.         System.out.println(Thread.currentThread().getId()  
  4.                 + ":============================= begin");  
  5.         j = 2;  
  6.         System.out.println(Thread.currentThread().getId() + ":" + j);  
  7.         j = 20;  
  8.         System.out.println(":" + j * 3 + ":");  
  9.         System.out.println(Thread.currentThread().getId()  
  10.                 + ":============================= end");  
  11.  
  12.     }  
  13.  

 

從上面的例子看到,我們使用類變量和實例變量的時候,都要非常小心,在多線程的環(huán)境下,很容易出現(xiàn)線程不安全的情況。上面我們還僅僅以基本類型int為例,如果是其他復(fù)雜類型,甚至像long這種在賦值時要兩次原子操作的基本數(shù)據(jù)類型,線程不安全的情況還要隱秘一些。

編輯推薦】

  1. JSP+JavaBean+Servlet結(jié)構(gòu)工作原理淺析
  2. Servlet頁面跳轉(zhuǎn)實現(xiàn)方法的區(qū)別
  3. Servlet多線程的相關(guān)問題淺析
  4. Servlet容器之安全多線程問題
  5. JSP Servlet開發(fā)最初那點事
責任編輯:金賀 來源: JavaEye博客
相關(guān)推薦

2012-02-21 14:14:47

Java

2011-07-14 14:21:11

2024-09-17 17:50:28

線程線程安全代碼

2019-02-13 15:49:00

2021-04-21 13:29:42

內(nèi)存安全Java

2011-07-18 08:58:24

2012-11-20 10:47:16

2023-10-27 13:31:18

線程安全多線程

2016-11-23 15:48:05

iOS APPCache

2022-04-11 10:56:43

線程安全

2011-06-03 13:15:01

JAVAEJB

2022-04-06 07:50:28

線程安全代碼

2019-04-04 11:55:59

2021-07-26 06:57:59

Synchronize線程安全

2009-05-30 09:36:18

2020-10-30 08:50:25

2010-04-02 13:53:47

2009-07-07 13:29:33

Servlet和JSP

2012-10-09 16:47:19

2016-03-01 11:44:57

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久久久国产精品午夜一区 | 成人片网址 | 欧美一区二区三区久久精品 | 天天干狠狠 | 成人久久久久久久久 | 亚洲高清视频一区二区 | 亚洲一区二区三区免费 | 欧美成人精品在线 | 国产精品免费一区二区三区四区 | 久久久久久国产精品免费免费 | 国产精品久久久久久久久污网站 | 91一区二区| 成年人在线观看视频 | 久久av网站 | 成人在线观看免费视频 | 黄片毛片免费观看 | 国产成人精品一区二区 | 日本小电影网站 | 欧美极品在线观看 | 夜夜夜操| 国产精品xxxx | 夜久久 | 日日夜夜天天 | 国产精品日韩欧美一区二区三区 | 国产99久久| 亚洲最大福利网 | 在线欧美a | 2019天天干夜夜操 | 91一区二区三区 | 欧美国产视频 | 精品粉嫩aⅴ一区二区三区四区 | 久久不卡区 | 国产午夜精品久久久 | 精品视频在线免费观看 | 国产色99| 国产日韩一区二区三区 | 91一区二区三区在线观看 | 天天草夜夜骑 | 欧美一级欧美三级在线观看 | 亚洲 精品 综合 精品 自拍 | 亚洲视频精品在线 |