Java賦值的執行緒安全問題
A a = new A();
這個操作分為三部處理
1.棧裡建立a的符號引用
2.堆裡建立A物件
3.把a指向A
所以,這個賦值語句不是執行緒安全的,比如下面的程式碼
public class A {
private volatile static A a;
public static A getInstance() {
if(a == null) {
synchronized(A.class) {
if(a == null) { // ①
a = new A();
}
}
}
return a;
}
}
在判斷①的時候,別的執行緒進行了1的操作(棧裡建立a的符號引用),這時a是null,並且a還沒有指向A。
那麼,另一個執行緒就會進入if語句塊,也建立a,並且new A(),這樣就會有2個A物件在堆裡
int i = 1;
是執行緒安全的,因為這條語句會被翻譯為一條指令iconst_1,不存線上程安全問題
相關推薦
Java之多執行緒安全(屌絲版,兩大解決思路,要麼不去競爭(開闢執行緒副本)、要麼有順序的競爭資源(用鎖規定執行緒秩序))
0、多執行緒安全,如果多個執行緒操作一個變數,每次都能達到預期的結果,那麼說明當前這個類起碼是執行緒安全的,我這白話的,可能有點噁心。 1、看看牛人是怎麼說的,為什麼多執行緒併發是不安全的? 在作業系統中,執行緒是不再擁有資源的,程序是擁有資源的。而執行緒是由程序建立的
java中的執行緒安全與鎖優化
Java的執行緒是對映到作業系統的原生執行緒之上的,如果要阻塞或喚醒一條執行緒,都需要作業系統來幫忙完成,這就需要作業系統來幫忙完成,需要從使用者態轉換到核心態中,狀態轉換需要耗費很多的處理器時間。如果是非常簡單的程式碼同步塊,狀態轉換消耗的時間可能比使用者程式碼執行的時間還要長。 因此可以說,syn
一道JAVA面試,執行緒安全和靜態內部類
前言:4月1號去一家網際網路公司面試,做了一份筆試。考察的內容也非常基礎,但是裡面卻充滿著各種各樣的擴充套件。但是這份題我做得並不好,平時用框架什麼的用多了,反而基礎顯得非常不紮實。憑著記憶寫起最後一套題目。記一下,紮實一下自己的基礎。 程式碼 /*
Java併發程式設計--執行緒安全問題與解決方案
本文簡介: 用多執行緒開發的人都知道,在多執行緒的開發過程中有可能會出現執行緒安全問題(專業術語叫記憶體可見性問題),但並不一定每次都會出現。出現這樣的情況,也會另開發者頭皮發麻,無從下手,接下來我們會慢慢深入,揭開多執行緒的神祕面紗。 本文主要介紹了Jav
Java ThreadLocal解決執行緒安全問題
轉載自:http://jiaozhiguang-126-com.iteye.com/blog/1667110 ThreadLocal是什麼 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal為解決多執行緒程式的併發問題提供了一
JAVA中的執行緒安全與非執行緒安全
ArrayList和Vector有什麼區別?HashMap和HashTable有什麼區別?StringBuilder和StringBuffer有什麼區別?這些都是Java面試中常見的基礎問題。面對這樣的問題,回答是:ArrayList是非執行緒安全的,Vector是執行緒
Java中的執行緒安全
執行緒安全問題之所以存在,本質原因是: 當多個執行緒訪問同一個資料的時候,可能引起衝突。而且這些執行緒中至少有一個執行緒會改寫這個資料時才會出現衝突,如果所有執行緒都只讀不改寫,則不會衝突。由於這個資料不只被一個執行緒訪問,我們稱這個資料為共享資料。 類中一
【java基礎】java語言的執行緒安全級別
java是支援多執行緒程式設計的語言,java中提供了很多類,如果把這些類的實現按照執行緒安全級別來排序的話,則由強到弱主要可以分為以下幾個級別 1 絕對執行緒安全 在任何環境下,呼叫者都不需要考慮額外的同步措施,都能夠保證程式的正確性。 這個定義要求很嚴格,java裡
JAVA中的執行緒安全與非執行緒安全理解
執行緒安全性不是一個非真即假的命題。 Vector 的方法都是同步的,並且 Vector 明確地設計為在多執行緒環境中工作。但是它的執行緒安全性是有限制的,即在某些方法之間有狀態依賴(類似地,如果在迭代過程中 Vector 被其他執行緒修改,那麼由 Vector.iterator() 返回的 itera
Java日期格式化-執行緒安全
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templa
在Java中構建執行緒安全的Set
我們常用的HashSet、TreeSet都是執行緒不安全的,在JDK1.8中ConcurrentHashMap類中新增了兩個方法,
Java賦值的執行緒安全問題
A a = new A(); 這個操作分為三部處理 1.棧裡建立a的符號引用 2.堆裡建立A物件 3.把a指向A 所以,這個賦值語句不是執行緒安全的,比如下面的程式碼 public class A { private volatile static A a;
Java多執行緒程式設計中執行緒的同步與互斥/執行緒安全/Java鎖
摘要:多執行緒三個特徵:原子性、可見性以及有序性.>執行緒的同步與互斥?(同步執行緒與非同步執行緒,執行緒同步和非同步問題) 1.同步:假設現有執行緒A和執行緒B,執行緒A需要往緩衝區寫資料,執行緒B需要從緩衝區讀資料,但他們之間存在一種制約
java多執行緒2.執行緒安全之可見性
要編寫正確的併發程式,關鍵在於:在訪問共享的可變狀態時需要進行正確的管理 可見性: 同步的另一個重要目的——記憶體可見性。 我們不僅希望防止某個執行緒正在使用物件狀態而另一個執行緒同時在修改狀態,而且希望當一個執行緒修改了物件狀態後,其他執行緒能夠看到發生的狀態變化(互斥訪問/通訊效果
Java併發理論基礎—執行緒安全策略
不可變物件需要滿足的條件: 1、物件建立以後其狀態就不能修改 2、物件所有域都是final型別 3、物件是正確建立的(在物件建立期間,this引用沒有逸出) final關鍵字:類、方法、變數 修飾類:不能被繼承 修飾方法:1、鎖定方法不被繼承類修改;2、效率 修飾變數:基
Java筆試題(三)——執行緒安全、String、StringBuffer、StringBuilder
1.什麼是執行緒安全? 簡單地說法:執行緒安全可以簡單理解為一個方法或者一個例項可以在多執行緒環境中使用而不會出現問題。 複雜的說法:當多個執行緒訪問同一個物件時,如果不用考慮這些執行緒在執行時環境下的排程和交替執行,也不需要進行額外的同步,或者在呼叫方進行任何其他的協調操作,呼叫這個物件的
Java語言中的執行緒安全
執行緒安全定義:當多個執行緒訪問一個物件時,如果不用考慮這些執行緒在執行時環境下的排程和交替執行,也不需要考慮進行額外的同步,或者在呼叫方進行任何其他的寫作操作,呼叫這個物件的行為都可以獲得正確的結果,那這個物件時執行緒安全的。 將Java語言中的各種操作共享的資料分為以下五類: 不可
Java併發程式設計(1)-執行緒安全基礎概述
文章目錄 一、執行緒安全性 1.1、無狀態類 1.2、有狀態類 二、原子性 2.1、原子操作 2.2、競爭操作 2.3、複合操作
Java併發程式設計之執行緒安全、執行緒通訊
Java多執行緒開發中最重要的一點就是執行緒安全的實現了。所謂Java執行緒安全,可以簡單理解為當多個執行緒訪問同一個共享資源時產生的資料不一致問題。為此,Java提供了一系列方法來解決執行緒安全問題。 synchronized synchronized用於同步多執行緒對共享資源的訪問,在實現中分為同步程
java併發程式設計一一多執行緒執行緒安全(四)
##1.java重排序 ###1.1資料依賴性 如果兩個操作訪問同一個變數時,且這兩個操作匯中有一個為寫操作,此時這兩個操作之間就 存在資料依賴性。資料依賴分下列三種類型。 名稱 程式碼示例 說明