国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java 集合中的類關于線程安全

Java 集合中的類關于線程安全

2020-07-29 14:44lqh Java教程

這篇文章主要介紹了Java 集合中的類關于線程安全的相關資料,需要的朋友可以參考下

Java集合中那些類是線程安全

線程安全類

在集合框架中,有些類是線程安全的,這些都是jdk1.1中的出現的。在jdk1.2之后,就出現許許多多非線程安全的類。 下面是這些線程安全的同步的類:

vector:就比arraylist多了個同步化機制(線程安全),因為效率較低,現在已經不太建議使用。在web應用中,特別是前臺頁面,往往效率(頁面響應速度)是優先考慮的。

statck:堆棧類,先進后出

hashtable:就比hashmap多了個線程安全

enumeration:枚舉,相當于迭代器

除了這些之外,其他的都是非線程安全的類和接口。

線程安全的類其方法是同步的,每次只能一個訪問。是重量級對象,效率較低。

其他:

1. hashtable跟hashmap的區別

hashtable是線程安全的,即hashtable的方法都提供了同步機制;hashmap不是線程安全的,即不提供同步機制 ;hashtable不允許插入空值,hashmap允許!

2. 多線程并發修改一 個 集合 怎么辦

用老的Vector/Hashtable類

StringBuffer是線程安全,而StringBuilder是線程不安全的。對于安全與不安全沒有深入的理解情況下,易造成這樣的錯覺,如果對于StringBuffer的操作均是線程安全的,然而,Java給你的保證的線程安全,是說它的方法是執行是排它的,而不是對這個對象本身的多次調用情況下,還是安全的。看看下邊的例子,在StringBufferTest中有一個數據成員contents它是用來擴展的,它的每一次append是線程安全的,但眾多次append的組合并不是線程安全的,這個輸出結果不是太可控的,但如果對于log和getContest方法加關鍵字synchronized,那么結果就會變得非常條理,如果換成StringBuider甚至是append到一半,它也會讓位于其它在此基礎上操作的線程:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class StringBufferTest {
  private StringBuffer contents = new StringBuffer();
  public void log(String message){
   contents.append(System.currentTimeMillis());
   contents.append("; ");
   contents.append(Thread.currentThread().getName());
   for(int i=0;i<10000;i++){
    contents.append(i); 
     contents.append(message);  //append本身是線程安全的,修改contents時,其它線程無法訪問。
     contents.append("\n");
   }
   contents.append("\n\n");
  }
  public void getContents(){
   System.out.println(contents);
  }
}
 
class RunThread extends Thread{
  String message;
  StringBufferTest buffer;
  public RunThread(StringBufferTest buffer, String message){
   this.buffer = buffer;
   this.message = message;
  }
  public void run(){
   while(true){
     buffer.log(message);
     buffer.getContents();
   }
  }
  public static void main(String[] args) {
   StringBufferTest ss = new StringBufferTest();
   new RunThread(ss, "you").start();
   new RunThread(ss, "me").start();
   new RunThread(ss, "she").start();
  }
}

        StringBuilder和StringBuffer的方法是一模一樣,就是一個多線程和一個單線程的問題。線程調用同一StringBuffer 的append方法,這跟他是不是線程安全沒有關系的,除非你的結果是append的一系列字符串變亂了,那才能說明他是線程不安全的。線程安全是指任何時刻都只有一個線程訪問臨界資源。線程安全 并不是說他的一系列操作是同步的 只是對于他執行某個方法的時候不允許別的線程去改變。針對一個類來說是不是線程安全就要看,多個線程在同時在運行,這些線程可能會同時執行某個方法。但是每次運行結果和單線程執行的結果一樣,那么就可以說是線程安全的。因為log方法沒有上鎖,每個現在在append鎖釋放后,都可能得到cpu的執行片段。

但不要對多線程安全存在誤解:

?
1
2
3
4
5
6
7
public String toString(){
  StringBuffer buffer = new StringBuffer();
  buffer.append('<');
  buffer.append(this.name);
  buffer.append('>');
  return buffer.toString();
 }

       這個代碼是完全線程安全的,在方法內部定義的變量,在每個線程線程進入的時候都會創建這個局部變量!不涉及線程安全問題。通常涉及系統安全的變量一般都是成員變量! stringBuffer本身的內部實現是現場安全的!線程安全那是類本身提供的功能是安全的。即你提供插入一個字符串,那么這個字符串插入是安全的,但是要插入兩個字符串,兩個的順序你來定,這之間如果有別的插入出錯就不管類的事情了,是你自己代碼的問題。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:http://www.cnblogs.com/tuojunjie/p/6089076.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 中文字幕在线不卡 | 国产成人一区二区三区 | 亚洲一区国产 | 1000部精品久久久久久久久 | 色精品 | 日韩在线小视频 | 国产欧美一区二区三区在线看 | 91亚洲国产成人久久精品网站 | 国产伦精品一区二区三区精品视频 | 日韩高清一区 | 免费欧美一级 | 色综合一区二区 | 北条麻妃99精品青青久久主播 | 国产精品视频入口 | 黄色av网站在线免费观看 | 樱桃小丸子在线观看 | 免费在线一区二区 | 国产欧美精品一区二区三区 | 成人精品电影 | 欧美日韩中文在线 | 久久久久久免费 | 日韩精品在线播放 | 欧美国产在线视频 | 日韩高清国产一区在线 | 免费在线看污视频 | 午夜免费电影 | 成人免费网站 | 欧洲亚洲一区 | 自拍偷拍欧美 | 91高清在线 | 日韩成人精品 | 91精品国产综合久久福利软件 | 91精品国产综合久久久久 | 日本在线不卡视频 | 成人一区二区三区久久精品嫩草 | 污视频网站在线观看 | 91免费网 | 午夜久久久| 精品www | 国产日产久久高清欧美一区 | 91视频免费在线看 |