1. 程式人生 > >java併發-原子性和可見性(7)

java併發-原子性和可見性(7)

原子性:某個操作同時只能由一個執行緒執行。

可見性:一個執行緒的修改對其他執行緒是可見的。也就是A執行緒修改了變數x,那麼B,C,D...執行緒此時去拿到的x肯定是A修改之後的值。

package com.concurenny.chapter.six;

/**
 * 建立者:Mr lebron 建立時間:2017年11月17日 下午2:27:32
 */
public class AtomicityDemo {
	private static int count = 0;

	public static void main(String[] args) {
		// 不是原子操作,可能會出現重複輸出
		for (int i = 0; i < 100; i++) {
			new Thread(() -> {
				System.out.println(add(1));
			}).start();
		}
		// 原子操作,不會有問題
		// for (int i = 0; i < 200; i++) {
		// new Thread(() -> {
		// System.out.println(add2(1));
		// ;
		// }).start();
		// }

	}

	public static int add(int plus) {
		// count = count + plus 顯然不是原子操作。
		// count = count+plus可能執行過程:
		// 有2個執行緒A,B同時執行該方法
		// 1.A:暫存器讀取count.
		// 2.B:暫存器讀取count.
		/// 3.A:對count執行+plus
		// 4.B:A:對count執行+plus
		// 5.A:賦值給count 這一步顯然得到了B執行緒的執行結果,並不是A執行緒想要的。
		// 6.B:賦值給count
		// 這裡原子性就是指A執行緒在執行count = count + plus操作時,整個過程不能有其他執行緒參與。
		// 可見性是指A執行count = count + plus之後的count對B可見,也就是B拿到的count是A計算之後的count的值。
		count = count + plus;
		return count;
	}

	// 加上synchronized之後,保證了原子性和可見性。因為同時只能有一個執行緒執行該方法,執行完畢會將變數count的值重新整理到記憶體中。其他執行緒執行該方法會得到新值。
	public static synchronized int add2(int plus) {
		int rst = count + plus;
		return rst;
	}
}

相關文章:

http://ifeve.com/java%E9%94%81%E6%98%AF%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%81%E6%80%A7%E7%9A%84/

相關推薦

java併發-原子可見7

原子性:某個操作同時只能由一個執行緒執行。 可見性:一個執行緒的修改對其他執行緒是可見的。也就是A執行緒修改了變數x,那麼B,C,D...執行緒此時去拿到的x肯定是A修改之後的值。 package com.concurenny.chapter.six; /** * 建

Java併發:volatile記憶體可見指令重排

1. 正確認識 volatile volatile變數具有synchronized的可見性特性,但是不具備原子特性。volatile變數可用於提供執行緒安全,但是隻能應用於非常有限的一組用例:多個變數之間或者某個變數的當前值與修改後值之間沒有約束。因此,單獨使用

java多執行緒學習筆記2---理解原子可見

1.原子性 原子,從字面意思理解就是構成物質的基本單位,那麼它就是不可分的,對於不能分割的操作就是原子操作,比如a=0,這個操作就是不能被分開的,把這種原子操作就稱為原子性,原子操作在同一時刻是不能被多個執行緒同時訪問的,所以不存線上程安全問題。然而還有很多操作都是可分的,就是非原子操作,就會存

synchronizedvolatile——原子可見

<div class="htmledit_views"> <h1 style="color:rgb(51,51,51);font-family:Arial;line-height:26px;text-align:center

原子可見的理解

併發程式設計中常見的兩個問題:原子性和可見性,雖然經常討論,但是隻是停留在應用層面,理解仍然還不是特別深刻。做個筆錄加深一下自己的理解。 原子性:定義為不可被分割的操作。單個指令可以是原子的,多個指令通過加鎖的方式也可以實現原子性。原子性可以是針對單核多執行緒,也可以針對多

Java數據結構算法——數組

image 創建 函數 編程 局限性 總結 遍歷數組 ron 添加   上篇博客我們簡單介紹了數據結構和算法的概念,對此模糊很正常,後面會慢慢通過具體的實例來介紹。本篇博客我們介紹數據結構的鼻祖——數組,可以說數組幾乎能表示一切的數據結構,在每一門編

Java數據結構算法——冒泡、選擇、插入排序算法

我們 逆序排列 pub 多少 img 目錄 http 最小 數據結構 目錄 1、冒泡排序 2、選擇排序 3、插入排序 4、總結   上一篇博客我們實現的數組結構是無序的,也就是純粹按照插入順序進行排列,那麽如何進行元素排序,本篇博客我們介紹幾種簡單的排序算

Java數據結構算法——高級排序

基本思想 初始 接受 center 左右 可能 並不是 str ins   春晚好看嗎?不存在的!!!   在Java數據結構和算法(三)——冒泡、選擇、插入排序算法中我們介紹了三種簡單的排序算法,它們的時間復雜度大O表示法都是O(N2),如果數據

Java數據結構算法——簡介

技術 其他 高程 度量 得出 rsh 基本功 represent 介紹 本系列博客我們將學習數據結構和算法,為什麽要學習數據結構和算法,這裏我舉個簡單的例子。   編程好比是一輛汽車,而數據結構和算法是汽車內部的變速箱。一個開車的人不懂變速箱的原理也是能開車的,同理一個不

Java數據結構算法:常用排序算法與經典題型

bre 操作 五步 增量排序 計算 -- clu 冒泡 i+1 常用的八種排序算法 1.直接插入排序 我們經常會到這樣一類排序問題:把新的數據插入到已經排好的數據列中。將第一個數和第二個數排序,然後構成一個有序序列將第三個數插入進去,構成一個新的有序序列。對第四

java併發機制的底層實現原理:volatile深入分析

     java程式碼最終會被類載入器載入到JVM中,然後轉化為彙編指令在CPU上執行。java中所使用的併發機制依賴於JVM的實現和CPU的指令。 1.volatile的應用 volatile是一個輕量級的synchronize,它保證了共享變數的可見性,確保了所有執

Java併發——執行緒安全的集合

1.對併發雜湊對映的批操作: Java SE 8為併發雜湊對映提供了批操作,即使有其他執行緒在處理對映,這些操作也能安全地執行。批操作會遍歷對映,處理遍歷過程中找到的元素。無須凍結當前對映的快照。 有三種不同的批操作:搜尋、歸約、forEach。 每個操作都有四個版本:operation

Java併發程式設計的藝術——讀書筆記 併發程式設計的挑戰

第一章 併發程式設計的挑戰 因為最近找工作,準備筆試/面試,開始嘗試閱讀這本書,我不常寫部落格,距上一次寫已經過去大概一年時間了,連CSDN密碼都忘了/衰,所以這次新開一個賬號重新開始,希望我能堅持下去。 第一章沒什麼內容,我認為其目的主要是給出足夠多的閱讀這本書的理

Java多執行緒記憶體模型:程序執行緒基礎

Java多執行緒和記憶體模型(一) 由於java是執行在 JVM上 的,所以需要涉及到 JVM 的記憶體模型概念,需要理解記憶體模型,就需要多執行緒的基礎; 而執行緒是基於載體執行緒裡的,所以我們藉由作業系統的程序來講一講。 程序 什麼是程序?

java併發程式設計應用易忘知識點1java中的鎖

Lock介面 Java se5之後,出現了Lock介面,提供了與Synchronized類似同步功能。與synchronized相比,他雖然少了隱式獲取釋放鎖的便捷性,卻擁有了鎖獲取與釋放的可操作性、可中斷的獲取鎖以及超時獲取鎖等多種synchronized不具備的同步特性

Java併發框架——AQS阻塞佇列管理——自旋鎖

我們知道一個執行緒在嘗試獲取鎖失敗後將被阻塞並加入等待佇列中,它是一個怎樣的佇列?又是如何管理此佇列?這節聊聊CHL Node FIFO佇列。 在談到CHL Node FIFO佇列之前,我們先分析這種佇列的幾個要素。首先要了解的是自旋鎖,所謂自旋鎖即是某一執行緒去嘗試獲取某個

JAVA併發程式設計——執行緒協作通訊

執行緒間的協作 在前面我們瞭解了很多關於同步(互斥鎖)的問題,下面來看一下執行緒之間的協作。這裡主要說一下Java執行緒中的join()、sleep()、yield()、wait()、notify()和notifyAll()方法。其中wait()、notify(

徹底明白java的位元組流字元流

java的IO流分兩種流 位元組流 InputStream OutputStream 字元流 Reader Writer 他們都是抽象類 具體實現 位元組流 FileInputStream FileOutputStream 字元流 Fil

Java併發框架——AQS阻塞佇列管理——自旋鎖優化

看Craig, Landin, and Hagersten發明的CLH鎖如何優化同步帶來的花銷,其核心思想是:通過一定手段將所有執行緒對某一共享變數輪詢競爭轉化為一個執行緒佇列且佇列中的執行緒各自輪詢自己的本地變數。這個轉化過程由兩個要點,一是構建怎樣的佇列&如何構建

Java併發與鎖設計實現詳述1- Java執行緒狀態

從這篇文章開始,我們正式進入Java併發與鎖的世界。何為併發?何為鎖?在Java中一般都是以執行緒為單位執行任務的,當多個執行緒在執行任務過程中在同一時間對某個共享資源進行訪問時,我們稱這種現象為併發,而為了保證多個執行緒在併發獲取這個共享資源的時候不會出現狀態不一致的問題或