1. 程式人生 > >執行緒的同步-集合的同步

執行緒的同步-集合的同步

兩個併發執行緒訪問同一個物件object中的這個synchronized(this)同步程式碼塊時,一個時間內只能有一個執行緒得到執行。另一個執行緒必須等待當前執行緒執行完這個程式碼塊以後才能執行該程式碼塊。

2種使用方法   

                  Synchronized method()

              synchronized(this){/*區塊*/},它的作用域是當前物件(只對同一個物件的多執行緒起作用);

注意:1  Synchronized只對同一個物件的多執行緒起作用,同一個類不同的物件例項的synchronized方法是不相干擾的

        2 Synchronized static Method{}防止多個執行緒同時訪問這個類中的synchronized static 方法。它可以對類的所有物件例項起作用。

考慮情況

      在多執行緒程式中,應當儘量使用執行緒安全的集合。在集合的修改和查詢過程中往往涉及到很多複雜的操作。比如set集合,在新增或刪除元素時,需要對其中的樹結構進行調整,一般需要在log(n)時間內才能完成,這樣如果兩個執行緒同時對同一個集合進行修改,就很可能造成這個集合的崩潰。可以使用讀寫鎖來對集合的修改加以控制,但是這種控制往往是複雜的,並且低效。因此java提供了一些執行緒安全的集合類,在多執行緒程式中可以使用這些執行緒安全的集合以避免可能的不一致和崩潰現象。

執行緒安全的集合主要包括:ConcurrentLinkedQueueConcurrentHashMap

ConcurrentSkipListMapConcurrentSkipListSet等,相關內容請到java.util.concurrent包中進行查詢。

<strong>List</strong>
ArrayList ,<span style="font-family:宋體,Arial; font-size:14px; line-height:21px; background-color:rgb(255,252,243)">LinkedList</span>不同步   Vector同步
ArrayList 如果要同步的話 List list = Collections.synchronizedList(new ArrayList(...));  參考api
<span style="font-family:宋體; font-size:16px; line-height:24px"></span><pre class="recommend-text mb-10" id="recommend-content-152144503" style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; font-family:arial,'courier new',courier,宋體,monospace; white-space:pre-wrap; word-wrap:break-word" name="code"><strong>Set</strong>
HashSet,LinkedHashSet不同步
<strong>Map</strong>
HashMap 不同步   HashTable 同步
<strong>Quque</strong>
LinkedBlockingQueue 同步
如果要同步非同步的集合 
 Collection c=Collections.synchronizedCollection(new ArrayList());
 List list=Collections.synchronizedList(new ArrayList());
 Set s=Collections.synchronizedSet(new HashSet());
 Map m=Collections.synchronizedMap(new HashMap());     
參考api
轉自http://blog.csdn.net/sd0902/article/details/8292601

相關推薦

java多執行10.構建同步工具

建立狀態依賴類的最簡單方法通常是在類庫中現有狀態依賴類的基礎上進行構造。如果類庫中沒有提供你需要的功能,可以使用java語言和類庫提供的底層機制來構造自己的同步機制,包括內建的條件佇列、顯示地Condition物件以及AbstractQueuedSynchronizer框架。 在單執行緒程式中呼叫方法時,如

程序執行間的同步機制

因為是轉載文章, 在此標明出處,如有冒犯請聯絡本人。 因為好的文章,以前只想收藏,但連線有時候會失效,所以現在碰到好的直接轉到自己這裡。 原文出處:http://www.cnblogs.com/memewry/archive/2012/08/22/2651696.html

執行基礎4 同步與通訊

 1.什麼情況下需要同步 當多執行緒併發執行同一程式碼時 希望某一段程式碼執行的過程中CPU不要切換到其他執行緒工作. 這時就需要同步.   2.同步程式碼塊 使用synchronized關鍵字加上一個鎖物件來定義一段程式碼, 這就叫同步程式碼塊 多個同步程式碼塊

python 多程序/多執行/協程 同步非同步

這篇主要是對概念的理解: 1、非同步和多執行緒區別:二者不是一個同等關係,非同步是最終目的,多執行緒只是我們實現非同步的一種手段。非同步是當一個呼叫請求傳送給被呼叫者,而呼叫者不用等待其結果的返回而可以做其它的事情。實現非同步可以採用多執行緒技術或則交給另外的程序來處理。多執行緒的好處,比較容易的實現了 非

執行之間實現同步

為什麼有執行緒安全問題   當多個執行緒同時共享同一個全域性變數或靜態變數,做寫的操作時,可能會發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。 什麼是多執行緒之間同步   當多個執行緒共享同一個資源,不會受到其他執行緒的干擾。 需求說明:2個視窗同時賣100張火車票問題

執行-衝突與同步程式碼

1. 使用synchronized(互斥)解決程式碼衝突問題 public class TestSynchronizedThread { /** * @param args * @throws InterruptedException */ public st

Java高併發——多執行協作,同步控制

      繼上一篇:Java高併發——多執行緒基礎 中講到,共享資源的合理使用,才能夠使多執行緒程式有條不紊的執行。其中我們通過synchronized來實現臨界區資源的是否可以訪問。而,這篇我們來重點總結synchronized的增強替代版鎖,以及其它JD

java 多執行synchronized鎖同步方法,同步程式碼塊

執行緒安全問題 同步和非同步 我們知道多個執行緒共享堆記憶體,當兩個或者多個執行緒呼叫同一個物件的方法操作物件成員時,因為cpu輪流執行執行緒,執行緒A剛開始操作物件方法,修改了資料,輪到執行緒B執行,執行緒B也操作物件方法,修改資料,可能又輪到執行緒A操作物件方法,接著上次執行緒A的剩餘部

[Xcode10 實際操作]八、網路與多執行-(8)使用同步Get方式查詢某地天氣

本文將演示如果通過Get的方式,請求某地天氣資訊,同步獲取網路資料, 一旦傳送同步請求,程式將停止使用者互動,直至伺服器返回資料。 為了增強資料訪問的安全性,從9.0版本開始,Xcode預設會把所有的網路請求,修改為https安全請求。 也可以修改配置檔案,以支援普通的網路請求。 點選開啟【Info.

[Xcode10 實際操作]八、網路與多執行-(11)使用同步Post方式查詢IP地址資訊

本文將演示如何通過Post請求,同步獲取IP地址資訊。 一旦傳送同步請求,程式將停止使用者互動,直至伺服器返回資料。 在專案導航區,開啟檢視控制器的程式碼檔案【ViewController.swift】 1 import UIKit 2 3 class ViewController:

執行間的同步與通訊(4)——Lock 和 Condtion

前言 前面幾篇我們學習了synchronized同步程式碼塊,瞭解了java的內建鎖,並學習了監視器鎖的wait/notify機制。在大多數情況下,內建鎖都能很好的工作,但它在功能上存在一些侷限性,例如無法實現非阻塞結構的加鎖規則等。為了拓展同步程式碼塊中的監視器

java多執行--簡易使用同步鎖實現一對一交替列印

一、本例需要分析的地方不多,只需要使用一個同步鎖+一個計數器就能搞定,直接奉送原始碼吧: package com.example.liuxiaobing.statemodel.mutil_thr

執行間的同步互斥學習

寫在最前面 華清遠見教育集團 15年專注高階IT培訓 做良心教育,做專業教育,做受人尊敬的職業教育 創客學院官網:http://www.makeru.com.cn/ 華清遠見創客學院嵌入式課程連結:http://www.makeru.com.cn/emb 華清遠見創客學院物聯網

Java多執行10:同步不具有繼承性

父類的同步操作子類是不可以繼承獲得的 package unit2; public class Demo8_tongbubujujichengxing { public static void m

Android多執行-----併發和同步(volatile)

volatile是Java提供的一種輕量級的同步機制,在併發程式設計中,它也扮演著比較重要的角色。同synchronized相比(synchronized通常稱為重量級鎖),volatile更輕量級,相比使用synchronized所帶來的龐大開銷,倘若能恰當的合理的使用volatile,自然是好事

Android多執行-----併發和同步(Lock)

一、為什麼需要Lock 如果一個程式碼塊被synchronized修飾了,當一個執行緒獲取了對應的鎖,並執行該程式碼塊時,其他執行緒便只能一直等待,等待獲取鎖的執行緒釋放鎖,而這裡獲取鎖的執行緒釋放鎖只會有兩種情況: 1)獲取鎖的執行緒執行完了該程式碼塊,然後執行緒釋放對鎖的佔有; 2)執行緒執

Android多執行-----併發和同步(synchronized)

一、鎖 物件的內建鎖和物件的狀態之間是沒有內在的關聯的,雖然大多數類都將內建鎖用做一種有效的加鎖機制,但物件的域並不一定通過內建鎖來保護。當獲取到與物件關聯的內建鎖時,並不能阻止其他執行緒訪問該物件,當某個執行緒獲得物件的鎖之後,只能阻止其他執行緒獲得同一個鎖。之所以每個物件都有一個內建鎖,是為

Android多執行-----併發和同步(ThreadLocal)

一.對ThreadLocal的理解        很多地方叫做執行緒本地變數,也有些地方叫做執行緒本地儲存,其實意思差不多。可能很多朋友都知道ThreadLocal為變數在每個執行緒中都建立了一個副本,那麼每個執行緒可以訪問自己內部的副本變數,也就是進行資

Java執行之Synchronized同步————Java學習之路(17)

前言——不進則退啊,部落格幾天沒寫,排名第一次下降了,得勤奮更新,不能偷懶。。 歡迎轉載,轉載請註明來處。 目錄 一.演示同步問題 此前,我們用的多執行緒都是較為簡單的例子,都沒有涉及到多個執行緒共享同一個物件或者資源的情況。倘若多執行緒共享資

Android多執行-----併發和同步(原子變數)

在java中的變數在++等操作是不是原子操作,分為先加一,然後賦值,從而在多執行緒編碼時需要加上synchronizeed,為了增加易用性,java當前提供了原子變數,當前的原子變數有AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference等,其特