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

關于Java語言中的線程安全問題

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

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

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

 

  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.  

 

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

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

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

:6:

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

152:2

:60:

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

 

  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方法上加一個同步關鍵字。

 

  1. public synchronized void testThreadLocal() 

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

 

  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關鍵字去掉,恢復到最初的代碼,然后把實例變量改成類變量。

 

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

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

 

  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.  

 

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

編輯推薦】

  1. JSP+JavaBean+Servlet結構工作原理淺析
  2. Servlet頁面跳轉實現方法的區別
  3. Servlet多線程的相關問題淺析
  4. Servlet容器之安全多線程問題
  5. JSP Servlet開發最初那點事
責任編輯:金賀 來源: JavaEye博客
相關推薦

2012-02-21 14:14:47

Java

2011-07-14 14:21:11

2024-09-17 17:50:28

線程線程安全代碼

2011-07-18 08:58:24

2019-02-13 15:49:00

2021-04-21 13:29:42

內存安全Java

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

線程安全

2022-04-06 07:50:28

線程安全代碼

2011-06-03 13:15:01

JAVAEJB

2021-07-26 06:57:59

Synchronize線程安全

2019-04-04 11:55:59

2022-04-07 07:40:40

線程安全變量

2024-11-14 14:53:04

2009-05-30 09:36:18

2012-12-04 16:57:49

2012-06-15 11:18:07

云安全云計算

2010-05-04 17:43:50

Unix系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩在线精品 | 国产日韩欧美一区二区 | 91亚洲视频在线 | 国产一区二区三区免费 | 日韩中文字幕在线视频 | 国产成人精品久久 | 在线国产视频观看 | 在线免费黄色 | 最新国产在线 | 精品久久久久国产免费第一页 | 日韩和的一区二区 | 欧美aⅴ | 一区二区三区影院 | 久久国产成人精品国产成人亚洲 | 国产99久久精品 | 成人在线免费网站 | 亚洲精品久久久久中文字幕欢迎你 | 欧美视频免费在线 | 91久久久久久久久 | 精品福利av导航 | 特黄毛片 | 亚洲成人免费视频在线观看 | 欧美成人h版在线观看 | 日韩a视频 | 黄色成人免费在线观看 | 亚洲精品99 | 亚洲欧洲精品一区 | 久久综合狠狠综合久久综合88 | 欧美久久精品一级c片 | 久久综合久久久 | 欧美精品一区二区三区四区 | 丁香五月缴情综合网 | 欧美video| 欧美亚洲视频 | 欧美在线亚洲 | 精品久久久一区二区 | 中文字幕在线免费观看 | 欧美日韩亚洲系列 | 美女黄视频网站 | 日韩二区 | 国产清纯白嫩初高生在线播放视频 |