自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java中線程安全問題個(gè)人理解

開發(fā) 后端
線程安全問題是一個(gè)比較高深的問題,是很多程序員比較難掌握的一個(gè)技術(shù)難點(diǎn),如果一個(gè)程序員對線程掌握的很好的話,那么這個(gè)程序員的內(nèi)功修煉的是相當(dāng)?shù)暮谩?/div>

線程安全問題是一個(gè)比較高深的問題,是很多程序員比較難掌握的一個(gè)技術(shù)難點(diǎn),如果一個(gè)程序員對線程掌握的很好的話,那么這個(gè)程序員的內(nèi)功修煉的是相當(dāng)?shù)暮谩?/p>

在這里我主要說一下我對java中如何保證線程安全的一些個(gè)人見解,希望對各位有所幫助,那里有不對的地方敬請給位不吝賜教。

線程安全問題主要出現(xiàn)在訪問臨界資源的時(shí)候,就是訪問同一個(gè)對象的時(shí)候,可能會出現(xiàn)無法挽回的損失,特別是在關(guān)于資金安全方面的時(shí)候,當(dāng)然還有數(shù)據(jù)庫事務(wù)方面的問題。他們很類似,都是要保證數(shù)據(jù)的原子性。

那么在java中如何保證線程安全呢?

對與共同使用的對象進(jìn)行加鎖,意思是我使用的時(shí)候,那么你就必須等待,等我用完之后你再用,反之依然。就像上廁所,你去的時(shí)候我是不能去的。

如何加鎖呢?下面寫三個(gè)加鎖的方式

首先看一下實(shí)例代碼

  1. public class TraditionalSynchornizedTest {  
  2.  /**  
  3.   * @param args  
  4.   */ 
  5.  public static void main(String[] args) {  
  6.   new TraditonalSynchornizedTest().sartThread();  
  7.  }  
  8.  public void sartThread(){  
  9.   final Outerput outerput = new Outerput();  
  10.   new Thread(new Runnable(){  
  11.    @Override 
  12.    public void run() {  
  13.     while(true){  
  14.      try {  
  15.       Thread.sleep(5);  
  16.      } catch (InterruptedException e) {  
  17.       e.printStackTrace();  
  18.      }  
  19.      outerput.print("zhangsanfeng");  
  20.     }  
  21.    }  
  22.      
  23.   }).start();  
  24.   new Thread(new Runnable(){  
  25.    @Override 
  26.    public void run() {  
  27.     while(true){  
  28.      try {  
  29.       Thread.sleep(5);  
  30.      } catch (InterruptedException e) {  
  31.       e.printStackTrace();  
  32.      }  
  33.      outerput.print("luxiaofeng");  
  34.     }  
  35.    }  
  36.      
  37.   }).start();  
  38.  }  
  39.  public class Outerput{  
  40.   public void print(String name){  
  41.    for(int i = 0;i < name.length(); i++){  
  42.     System.out.print(name.charAt(i));  
  43.    }  
  44.    System.out.println();  
  45.   }  
  46.  }  

以上代碼沒有對共同持有的對象outerput加鎖,所以會出現(xiàn)線程安全問題

1、對代碼塊加鎖

對共同持有的對象加鎖可以把內(nèi)部類寫成這樣的

  1. public class Outerput{  
  2.   public void print(String name){  
  3.    synchronized (this) {  
  4.     for(int i = 0;i < name.length(); i++){  
  5.      System.out.print(name.charAt(i));  
  6.     }  
  7.     System.out.println();  
  8.    }  
  9.   }  
  10.  } 

2、對非靜態(tài)方法加鎖,加鎖的對象是this

  1. public class Outerput{  
  2.   public synchronized void print(String name){  
  3.    for(int i = 0;i < name.length(); i++){  
  4.     System.out.print(name.charAt(i));  
  5.    }  
  6.    System.out.println();  
  7.   }  
  8.  }  

3、對靜態(tài)方法加鎖的對象到底是誰?

  1. public static synchronized  void print2(String name){  
  2.    for(int i = 0;i < name.length(); i++){  
  3.     System.out.print(name.charAt(i));  
  4.    }  
  5.    System.out.println();  
  6.   } 

其實(shí)加鎖的對象是字節(jié)碼對象,Outerput.class

如果和非靜態(tài)方法同時(shí)持有同一個(gè)對象時(shí),可以持有同一個(gè)字節(jié)碼對象。

原文鏈接:http://flystar007.iteye.com/blog/1404430

【編輯推薦】

  1. Java中參數(shù)傳遞類型只有值傳遞
  2. 利用Java進(jìn)行MySql數(shù)據(jù)庫的導(dǎo)入和導(dǎo)出
  3. Java堆內(nèi)存的10個(gè)要點(diǎn)
  4. Play!在云端:Java PaaS平臺入門
  5. ZK 6.0正式發(fā)布 基于Java的Ajax框架

 

責(zé)任編輯:林師授 來源: flystar007的博客
相關(guān)推薦

2011-03-29 10:41:51

Java線程安全

2018-10-10 21:00:50

2016-11-23 15:48:05

iOS APPCache

2023-10-27 13:31:18

線程安全多線程

2024-09-17 17:50:28

線程線程安全代碼

2022-04-11 10:56:43

線程安全

2013-07-23 10:36:02

RFID技術(shù)個(gè)人隱私安全隱私安全

2021-02-02 09:08:41

智能家居數(shù)據(jù)安全漏洞

2019-09-26 10:19:27

設(shè)計(jì)電腦Java

2021-07-26 06:57:59

Synchronize線程安全

2019-04-04 11:55:59

2012-11-20 10:47:16

2009-05-30 09:36:18

2022-04-06 07:50:28

線程安全代碼

2019-12-06 09:44:27

HTTP數(shù)據(jù)安全

2011-08-25 15:54:54

隱私手機(jī)

2021-12-01 23:20:25

網(wǎng)絡(luò)安全信息安全數(shù)據(jù)安全

2011-03-21 10:23:06

2013-04-02 11:07:16

2009-11-03 13:46:56

Oracle密碼
點(diǎn)贊
收藏

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