我們有時(shí)會(huì)遇到對(duì)同一個(gè)內(nèi)存區(qū)域如數(shù)組或者鏈表進(jìn)行多線程讀寫(xiě)的情況,一般來(lái)說(shuō)有以下幾種處理方式:
1.不加任何限制,多見(jiàn)于讀取寫(xiě)入都很快的情況,但有時(shí)也會(huì)出現(xiàn)問(wèn)題.
2.對(duì)讀寫(xiě)函數(shù)都加以同步鎖,比如使用singleton模式,這下問(wèn)題是沒(méi)了,但效率也下去了,比如說(shuō)兩個(gè)讀取線程不是非要排隊(duì)進(jìn)入不可.
3.讀寫(xiě)鎖,安全和效率都得到了解決,特別合適讀線程多于寫(xiě)線程的情況.也就是下面將要展現(xiàn)的模式.
讀寫(xiě)鎖的本意是分別對(duì)讀寫(xiě)狀態(tài)進(jìn)行互斥區(qū)分,有互斥時(shí)才加鎖,否則放行.互斥的情況有:
1.讀寫(xiě)互斥.
2.寫(xiě)寫(xiě)互斥.
不互斥的情況是:讀讀,這種情況不該加以限制.
我們只要讓鎖對(duì)象知道當(dāng)前讀寫(xiě)狀態(tài)就可以了,再根據(jù)情況進(jìn)行鎖定和解鎖,然后再分情況進(jìn)行鎖定.請(qǐng)看代碼
代碼如下:
DataLib類(lèi),注意其中try...finally 的寫(xiě)法,它保證了加鎖解鎖過(guò)程是成對(duì)調(diào)用的:
package com.sitinspring.readwritelock;

import java.util.ArrayList;
import java.util.List;


/** *//**
* 數(shù)據(jù)倉(cāng)庫(kù)類(lèi),用于保存數(shù)據(jù)
*
* @author sitinspring(junglesong@gmail.com)
*
*/

public class DataLib
{
private List<String> datas;

private ReadWriteLock lock;


public DataLib()
{
datas = new ArrayList<String>();
lock = new ReadWriteLock();
}

// 寫(xiě)入數(shù)據(jù),這時(shí)不能讀取

public void writeData(List<String> newDatas)
{

try
{
lock.writeLock();
Test.sleep(2);
datas=newDatas;

} finally
{
lock.writeUnlock();
}
}

// 讀取數(shù)據(jù),這時(shí)不能寫(xiě)入

public List<String> readData()
{

try
{
lock.readLock();
Test.sleep(1);
return datas;

} finally
{
lock.readUnlock();
}

}

}
ReadWriteLock類(lèi),很重要:
package com.sitinspring.readwritelock;


/** *//**
* 讀寫(xiě)鎖,用于線程控制
* @author sitinspring(junglesong@gmail.com)
*
*/

public class ReadWriteLock
{
// 讀狀態(tài)
private boolean isRead;
// 寫(xiě)狀態(tài)
private boolean isWrite;

public synchronized void readLock()
{
// 有寫(xiě)入時(shí)讀取線程停止

while(isWrite)
{

try
{
System.out.println("有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)");
wait();
}

catch(InterruptedException ex)
{
ex.printStackTrace();
}
}
System.out.println("設(shè)定鎖為讀取狀態(tài)");
isRead=true;
}

public synchronized void readUnlock()
{
System.out.println("解除讀取鎖");
isRead=false;
notifyAll();
}

public synchronized void writeLock()
{
// 有讀取時(shí)讀取線程停止

while(isRead)
{

try
{
System.out.println("有線程在進(jìn)行讀取,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)");
wait();
}

catch(InterruptedException ex)
{
ex.printStackTrace();
}
}
// 有寫(xiě)入時(shí)寫(xiě)入線程也一樣要停止

while(isWrite)
{

try
{
System.out.println("有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)");
wait();
}

catch(InterruptedException ex)
{
ex.printStackTrace();
}
}
System.out.println("設(shè)定鎖為寫(xiě)入狀態(tài)");
isWrite=true;
}

public synchronized void writeUnlock()
{
System.out.println("解除寫(xiě)入鎖");
isWrite=false;
notifyAll();
}
}
Writer類(lèi):
package com.sitinspring.readwritelock;

import java.util.ArrayList;
import java.util.Random;


/** *//**
* 用于讀取文件,寫(xiě)入數(shù)據(jù)倉(cāng)庫(kù)
* @author sitinspring(junglesong@gmail.com)
*
*/

public class Writer implements Runnable
{
private DataLib dataLib;
private static final Random random=new Random();

private String[] mockDatas=
{"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};

public Writer(DataLib dataLib,String[] mockDatas)
{
this.dataLib=dataLib;
this.mockDatas=mockDatas;
Thread thread=new Thread(this);
thread.start();
}

public void run()
{

while(true)
{
Test.sleep(random.nextInt(3));
int startIndex=random.nextInt(mockDatas.length);
ArrayList<String> newDatas=new ArrayList<String>();

for(int i=startIndex;i<mockDatas.length;i++)
{
newDatas.add(mockDatas[i]);
}
dataLib.writeData(newDatas);
}
}
}
Reader類(lèi):
package com.sitinspring.readwritelock;

import java.util.List;
import java.util.Random;


/** *//**
* 用于從數(shù)據(jù)倉(cāng)庫(kù)中得到數(shù)據(jù)
* @author sitinspring(junglesong@gmail.com)
*
*/

public class Reader implements Runnable
{
private DataLib dataLib;
private static final Random random=new Random();

public Reader(DataLib dataLib)
{
this.dataLib=dataLib;
Thread thread=new Thread(this);
thread.start();
}

public void run()
{

while(true)
{
Test.sleep(random.nextInt(2));
List<String> datas=dataLib.readData();
System.out.print(">>取得數(shù)組為:");

for(String data:datas)
{
System.out.print(data+",");
}
System.out.print("\n");
}
}
}
測(cè)試類(lèi):
package com.sitinspring.readwritelock;


/** *//**
* main函數(shù)所在類(lèi)
* @author sitinspring(junglesong@gmail.com)
*
*/

public class Test
{

public static void main(String[] args)
{
DataLib dataLib=new DataLib();

String[] mockDatas1=
{"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
Writer writer1=new Writer(dataLib,mockDatas1);

String[] mockDatas2=
{"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};
Writer writer2=new Writer(dataLib,mockDatas2);
Reader reader1=new Reader(dataLib);
Reader reader2=new Reader(dataLib);
Reader reader3=new Reader(dataLib);
}
// 用于延時(shí)

public static void sleep(int sleepSecond)
{

try
{
Thread.sleep(sleepSecond*1000);
}

catch(Exception ex)
{
ex.printStackTrace();
}
}
}
測(cè)試結(jié)果:
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
解除讀取鎖
>>取得數(shù)組為:
設(shè)定鎖為讀取狀態(tài)
有線程在進(jìn)行讀取,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行讀取,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
設(shè)定鎖為寫(xiě)入狀態(tài)
>>取得數(shù)組為:
解除讀取鎖
>>取得數(shù)組為:
解除讀取鎖
>>取得數(shù)組為:
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
解除讀取鎖
>>取得數(shù)組為:亥,
解除讀取鎖
>>取得數(shù)組為:亥,
解除讀取鎖
>>取得數(shù)組為:亥,
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行讀取,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
>>取得數(shù)組為:乙,丙,丁,戊,己,庚,辛,壬,癸,
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
>>取得數(shù)組為:申,酉,戌,亥,
解除讀取鎖
>>取得數(shù)組為:申,酉,戌,亥,
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行讀取,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
>>取得數(shù)組為:丁,戊,己,庚,辛,壬,癸,
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
>>取得數(shù)組為:亥,
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
>>取得數(shù)組為:亥,
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
>>取得數(shù)組為:丁,戊,己,庚,辛,壬,癸,
解除讀取鎖
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
>>取得數(shù)組為:丁,戊,己,庚,辛,壬,癸,
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行讀取,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
>>取得數(shù)組為:巳,午,未,申,酉,戌,亥,
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
>>取得數(shù)組為:巳,午,未,申,酉,戌,亥,
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
解除讀取鎖
>>取得數(shù)組為:戌,亥,
解除讀取鎖
>>取得數(shù)組為:戌,亥,
解除讀取鎖
>>取得數(shù)組為:戌,亥,
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
有線程在進(jìn)行讀取,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
設(shè)定鎖為讀取狀態(tài)
解除讀取鎖
>>取得數(shù)組為:丙,丁,戊,己,庚,辛,壬,癸,
解除讀取鎖
>>取得數(shù)組為:丙,丁,戊,己,庚,設(shè)定鎖為寫(xiě)入狀態(tài)
辛,壬,癸,
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
>>取得數(shù)組為:丙,丁,戊,己,庚,辛,壬,癸,
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行讀取,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
>>取得數(shù)組為:癸,
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
>>取得數(shù)組為:癸,
解除讀取鎖
>>取得數(shù)組為:癸,
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
解除讀取鎖
>>取得數(shù)組為:戊,己,庚,辛,壬,癸,
解除讀取鎖
>>取得數(shù)組為:戊,己,庚,辛,壬,癸,
解除讀取鎖
>>取得數(shù)組為:戊,己,庚,辛,壬,癸,
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行讀取,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
>>取得數(shù)組為:乙,丙,丁,戊,己,庚,辛,壬,癸,
解除讀取鎖
>>取得數(shù)組為:乙,解除讀取鎖
>>取得數(shù)組為:乙,丙,丁,戊,己,庚,辛,壬,癸,
丙,丁,戊,己,庚,辛,有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
壬,癸,
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
解除讀取鎖
>>取得數(shù)組為:庚,辛,壬,癸,
解除讀取鎖
>>取得數(shù)組為:庚,辛,壬,癸,
解除讀取鎖
>>取得數(shù)組為:庚,辛,壬,癸,
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行讀取,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
>>取得數(shù)組為:亥,
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
>>取得數(shù)組為:亥,
解除讀取鎖
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
>>取得數(shù)組為:有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
亥,
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
解除讀取鎖
>>取得數(shù)組為:癸,
解除讀取鎖
>>取得數(shù)組為:癸,
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
>>取得數(shù)組為:癸,
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
>>取得數(shù)組為:申,酉,戌,亥,
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
有線程在進(jìn)行讀取,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
設(shè)定鎖為讀取狀態(tài)
解除讀取鎖
>>取得數(shù)組為:癸,
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
>>取得數(shù)組為:癸,
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
>>取得數(shù)組為:癸,
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行讀取,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
>>取得數(shù)組為:戊,己,庚,辛,壬,癸,
解除讀取鎖
>>取得數(shù)組為:戊,己,庚,辛,壬,癸,
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行讀取,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
>>取得數(shù)組為:亥,
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
>>取得數(shù)組為:亥,
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行讀取,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
>>取得數(shù)組為:丁,戊,己,庚,辛,壬,癸,
解除讀取鎖
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
>>取得數(shù)組為:丁,戊,己,庚,辛,壬,癸,
解除寫(xiě)入鎖
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
解除讀取鎖
>>取得數(shù)組為:癸,
解除讀取鎖
>>取得數(shù)組為:癸,
解除讀取鎖
>>取得數(shù)組為:癸,
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行讀取,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
解除讀取鎖
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
>>取得數(shù)組為:辰,巳,午,未,申,酉,戌,亥,
有線程在進(jìn)行寫(xiě)入,寫(xiě)入線程停止,進(jìn)入等待狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)
解除寫(xiě)入鎖
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為讀取狀態(tài)
設(shè)定鎖為寫(xiě)入狀態(tài)
有線程在進(jìn)行寫(xiě)入,讀取線程停止,進(jìn)入等待狀態(tài)

代碼下載:
http://www.tkk7.com/Files/sitinspring/ReadWriteLock20071021115927.rar