1. 程式人生 > >線程的共享性、互斥性、原子性、可見性、有序性

線程的共享性、互斥性、原子性、可見性、有序性

共享數據 class color sync out 訪問者 nal print @override

參考鏈接:http://www.cnblogs.com/paddix/p/5374810.html

一、共享性

多個線程之間共享同一個變量,容易引發多線程安全問題。反之,如果每個數據都只是在自己的線程中使用,只屬於某一個線程,那麽這個數據則為安全的。

二、互斥性

資源互斥是指只允許一個訪問者對其進行訪問,具有唯一性和排他性。對於共享數據,如果我們只進行讀數據,即使沒有互斥性,我們也不需要擔心其安全,但如果是寫操作,則容易引起線程安全問題。

三、原子性

原子性是指對數據的操作是一個獨立的、不可分割的整體。也就是一次操作,是一個連續的不可中斷的操作,數據不可以被其他線程修改。i++不是原子性操作

要保證互斥性和原子性,都可以使用synchronized來修飾。

四、可見性

對於共享變量,線程每次讀取的是工作內存中共享變量的副本,寫入的時候也直接修改工作內存中副本的值,然後在某個時間點上再將工作內存與主內存中的值進行同步。這樣導致的問題是,如果線程1對某個變量進行了修改,線程2卻有可能看不到線程1對共享變量所做的修改。通過下面這段程序我們可以演示一下不可見的問題。

五、有序性

public class TraditionalThreadSynchronized {

    public static void main(String[] args){
       Outputer out = new Outputer();
       new
Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } out.output("zhangsan"); } }).start();
new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } out.output("lisi"); } }).start(); new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } out.output("aobama"); } }).start(); new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } out.output("pulangte"); } }).start(); } } class Outputer{ public void output(String str){ for(int i =0;i< str.length();i++){ System.out.print(str.charAt(i)+" "); } } }

輸出結果:

z l h a n g s a i n s i p u l a a o b a m a n g t e 

這說明線程不具有有序性

線程的共享性、互斥性、原子性、可見性、有序性