java并发数据共享机制_Java并发编程:核心理论之数据共享性
原標題:Java并發編程:核心理論之數據共享性
并發編程是Java程序員最重要的技能之一,也是最難掌握的一種技能。它要求編程者對計算機最底層的運作原理有深刻的理解,同時要求編程者邏輯清晰、思維縝密,這樣才能寫出高效、安全、可靠的多線程并發程序。本系列會從線程間協調的方式(wait、notify、notifyAll)Synchronized及Volatile的本質入手,詳細解釋JDK為我們提供的每種并發工具和底層實現機制。在此基礎上,我們會進一步分析java.util.concurrent包的工具類,包括其使用方式、實現源碼及其背后的原理。本文是該系列的第一篇文章,是這系列中最核心的理論部分,之后的文章都會以此為基礎來分析和解釋。
一、共享性
數據共享性是線程安全的主要原因之一。如果所有的數據只是在線程內有效,那就不存在線程安全性問題,這也是我們在編程的時候經常不需要考慮線程安全的主要原因之一。但是,在多線程編程中,數據共享是不可避免的。最典型的場景是數據庫中的數據,為了保證數據的一致性,我們通常需要共享同一個數據庫中數據,即使是在主從的情況下,訪問的也同一份數據,主從只是為了訪問的效率和數據安全,而對同一份數據做的副本。我們現在,通過一個簡單的示例來演示多線程下共享數據導致的問題:
代碼段一:
package com.paddx.test.concurrent;
public class ShareData {
public static int count = 0;
public static void main(String[] args) {
final ShareData data = new ShareData();
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
//進入的時候暫停1毫秒,增加并發問題出現的幾率
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int j = 0; j < 100; j++) {
data.addCount();
}
System.out.print(count + " ");
}
}).start();
}
try {
//主程序暫停3秒,以保證上面的程序執行完成
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("count=" + count);
}
public void addCount() {
count++;
}
}
上述代碼的目的是對count進行加一操作,執行1000次,不過這里是通過10個線程來實現的,每個線程執行100次,正常情況下,應該輸出1000.不過,如果你運行上面的程序,你會發現結果卻不是這樣。下面是某次的執行結果(每次運行的結果不一定相同,有時候也可能獲取到正確的結果):
可以看出,對共享變量操作,在多線程環境下很容易出現各種意想不到的的結果。
來源:http://www.cnblogs.com/paddix/p/5374810.html
責任編輯:
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java并发数据共享机制_Java并发编程:核心理论之数据共享性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dnf中有多少角色?
- 下一篇: java中怎么判断一段代码时线程安全还是