在上文中提到了Lock接口以及對象
使用它
很優雅的控制了競爭資源的安全訪問
但是這種鎖不區分讀寫
稱這種鎖為普通鎖
為了提高性能
Java提供了讀寫鎖
在讀的地方使用讀鎖
在寫的地方使用寫鎖
靈活控制
在一定程度上提高了程序的執行效率
Java中讀寫鎖有個接口ncurrent
locks
ReadWriteLock
也有具體的實現ReentrantReadWriteLock
詳細的API可以查看JavaAPI文檔
下面這個例子是在文例子的基礎上
將普通鎖改為讀寫鎖
並添加賬戶余額查詢的功能
代碼如下
import ncurrent
ExecutorService;
import ncurrent
Executors;
import ncurrent
locks
ReadWriteLock;
import ncurrent
locks
ReentrantReadWriteLock;
/**
* Java線程
鎖
*
* @author leizhimin
:
:
*/
public class Test {
public static void main(String[] args) {
//創建並發訪問的賬戶
MyCount myCount = new MyCount(
);
//創建一個鎖對象
ReadWriteLock lock = new ReentrantReadWriteLock(false);
//創建一個線程池
ExecutorService pool = Executors
newFixedThreadPool(
);
//創建一些並發訪問用戶
一個信用卡
存的存
取的取
好熱鬧啊
User u
= new User(
張三
myCount
lock
false);
User u
= new User(
張三他爹
myCount
lock
false);
User u
= new User(
張三他弟
myCount
lock
false);
User u
= new User(
張三
myCount
lock
false);
User u
= new User(
張三他爹
myCount
lock
true);
//在線程池中執行各個用戶的操作
pool
execute(u
);
pool
execute(u
);
pool
execute(u
);
pool
execute(u
);
pool
execute(u
);
//關閉線程池
pool
shutdown();
}
}
/**
* 信用卡的用戶
*/
class User implements Runnable {
private String name; //用戶名
private MyCount myCount; //所要操作的賬戶
private int iocash; //操作的金額
當然有正負之分了
private ReadWriteLock myLock; //執行操作所需的鎖對象
private boolean ischeck; //是否查詢
User(String name
MyCount myCount
int iocash
ReadWriteLock myLock
boolean ischeck) {
this
name = name;
this
myCount = myCount;
this
iocash = iocash;
this
myLock = myLock;
this
ischeck = ischeck;
}
public void run() {
if (ischeck) {
//獲取讀鎖
myLock
readLock()
lock();
System
out
println(
讀
+ name +
正在查詢
+ myCount +
賬戶
當前金額為
+ myCount
getCash());
//釋放讀鎖
myLock
readLock()
unlock();
} else {
//獲取寫鎖
myLock
writeLock()
lock();
//執行現金業務
System
out
println(
寫
+ name +
正在操作
+ myCount +
賬戶
金額為
+ iocash +
當前金額為
+ myCount
getCash());
myCount
setCash(myCount
getCash() + iocash);
System
out
println(
寫
+ name +
操作
+ myCount +
賬戶成功
金額為
+ iocash +
當前金額為
+ myCount
getCash());
//釋放寫鎖
myLock
writeLock()
unlock();
}
}
}
/**
* 信用卡賬戶
可隨意透支
*/
class MyCount {
private String oid; //賬號
private int cash; //賬戶余額
MyCount(String oid
int cash) {
this
oid = oid;
this
cash = cash;
}
public String getOid() {
return oid;
}
public void setOid(String oid) {
this
oid = oid;
}
public int getCash() {
return cash;
}
public void setCash(int cash) {
this
cash = cash;
}
@Override
public String toString() {
return
MyCount{
+
oid=
+ oid +
\
+
cash=
+ cash +
}
;
}
}
寫
張三正在操作MyCount{oid=
cash=
}賬戶
金額為
當前金額為
寫
張三操作MyCount{oid=
cash=
}賬戶成功
金額為
當前金額為
寫
張三他弟正在操作MyCount{oid=
cash=
}賬戶
金額為
當前金額為
寫
張三他弟操作MyCount{oid=
cash=
}賬戶成功
金額為
當前金額為
寫
張三正在操作MyCount{oid=
cash=
}賬戶
金額為
當前金額為
寫
張三操作MyCount{oid=
cash=
}賬戶成功
金額為
當前金額為
讀
張三他爹正在查詢MyCount{oid=
cash=
}賬戶
當前金額為
寫
張三他爹正在操作MyCount{oid=
cash=
}賬戶
金額為
當前金額為
寫
張三他爹操作MyCount{oid=
cash=
}賬戶成功
金額為
當前金額為
Process finished with exit code
在實際開發中
最好在能用讀寫鎖的情況下使用讀寫鎖
而不要用普通鎖
以求更好的性能
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25525.html