Cyh的博客
Email:kissyan4916@163.com
posts - 26, comments - 19, trackbacks - 0, articles - 220
導航
BlogJava
首頁
新隨筆
聯系
聚合
管理
公告
一直努力努力努力,像奴隸奴隸奴隸!~~
<
2025年5月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
常用鏈接
我的隨筆
我的文章
我的評論
我的參與
最新評論
隨筆檔案
(25)
2011年5月 (1)
2010年4月 (12)
2010年1月 (1)
2009年12月 (2)
2009年6月 (1)
2009年4月 (4)
2009年2月 (4)
文章分類
(219)
Android(26)
DB(5)
J2EE(31)
J2SE(79)
JavaScript(15)
others(47)
SOA&Web Service(1)
中間件(1)
軟件工程(12)
軟件架構(2)
文章檔案
(220)
2011年8月 (1)
2010年12月 (23)
2010年11月 (2)
2010年8月 (5)
2010年7月 (2)
2010年6月 (2)
2010年5月 (1)
2010年4月 (12)
2010年3月 (28)
2010年2月 (5)
2010年1月 (23)
2009年12月 (39)
2009年6月 (14)
2009年5月 (31)
2009年3月 (2)
2009年2月 (29)
2009年1月 (1)
新聞檔案
(66)
2010年10月 (1)
2010年9月 (5)
2010年8月 (11)
2010年7月 (21)
2010年6月 (13)
2010年5月 (8)
2010年4月 (5)
2009年11月 (2)
相冊
Ryan
收藏夾
(7)
JAVA(7)
最新隨筆
1.?集成FCKeditor 3.5.3
2.?android自適應屏幕方向和大小
3.?Android游戲開發之旅(二十) 雙按事件捕獲
4.?Android游戲開發之旅(十八) SoundPool類
5.?Android游戲開發之旅(十九) 分辨率大全
6.?Android游戲開發之旅(十七) 圖像漸變特效
7.?Android游戲開發之旅(十六) 異步音樂播放
8.? Android游戲開發之旅(十四) 游戲開發實戰一
9.?Android游戲開發之旅(十五) 按鍵中斷處理
10.?Android游戲開發之旅(十二)Sensor重力感應(2)
搜索
最新評論
1.?re: struts2 checkboxlist標簽的使用
同居同意同意
--yuk
2.?re: struts2 checkboxlist標簽的使用
ss
--d
3.?re: JavaMail(4)--使用POP3接收郵件
郵件信息可以打印出來,可是下載郵件會出錯是什么原因?
--琳喵喵0721
4.?re: JavaMail(4)--使用POP3接收郵件
評論內容較長,點擊標題查看
--流風
5.?re: 操作PDF文件
評論內容較長,點擊標題查看
--ly.wolf
閱讀排行榜
1.?struts2 checkboxlist標簽的使用(18234)
2.?struts2異常攔截器(5862)
3.?struts2迭代標簽(3847)
4.?用freemind 秒殺Spring Security(1920)
5.?加載順序會影響對spring bean 的調用。(1491)
線程--鎖
Posted on 2009-12-22 21:10
啥都寫點
閱讀(514)
評論(0)
編輯
收藏
所屬分類:
J2SE
ReentrantLock類實現了Lock接口,通過它可以完全取代synchronized關鍵字
ReentrantLock的lock方法取得鎖,如果該鎖定沒有被其他線程占據,則獲取該鎖定并返回,將保持計數器置為1;如果當前線程已經占據鎖,則立即返回,將保持計數器加1;如果鎖定被其他線程占據,則當前線程進入睡眠狀態,等待其他線程釋放鎖,此事保持計數器為1.
ReentrantLock的unlock方法釋放鎖,如果當前線程是鎖的占有者,則將保持計數器減1,如果保持計算器等于0,則釋放鎖。如果當前線程不是鎖的占有者,則拋出異常。
ReadWriteLock是一個繼承Lock的接口,定義了讀寫鎖。它的一個實現類是ReentrantReadWriteLock。
ReentrantReadWriteLock的writeLock方法獲得用于寫入操作的鎖定,當獲得寫入鎖時,其他線程想進行讀寫操作都必須等待。
ReentrantReadWriteLock的readLock方法獲得用于讀操作的鎖定,當獲得讀取鎖時,其他讀的線程可以繼續獲得讀取鎖,但是不能獲得寫入鎖。
package
book.j2se5.thread;
import
java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;
import
java.util.concurrent.Future;
import
java.util.concurrent.locks.Lock;
import
java.util.concurrent.locks.ReadWriteLock;
import
java.util.concurrent.locks.ReentrantLock;
import
java.util.concurrent.locks.ReentrantReadWriteLock;
/** */
/**
* Lockers
* 在多線程編程里面一個重要的概念是鎖定,如果一個資源是多個線程共享的,為了保證數據的完整性,
* 在進行事務性操作時需要將共享資源鎖定,這樣可以保證在做事務性操作時只有一個線程能對資源進行操作,
* 從而保證數據的完整性。在5.0以前,鎖定的功能是由Synchronized關鍵字來實現的。
*/
public
class
Lockers
{
/** */
/**
* 測試Lock的使用。在方法中使用Lock,可以避免使用Synchronized關鍵字。
*/
public
static
class
LockTest
{
Lock lock
=
new
ReentrantLock();
//
鎖
double
value
=
0d;
//
值
int
addtimes
=
0
;
/** */
/**
* 增加value的值,該方法的操作分為2步,而且相互依賴,必須實現在一個事務中
* 所以該方法必須同步,以前的做法是在方法聲明中使用Synchronized關鍵字。
*/
public
void
addValue(
double
v)
{
lock.lock();
//
取得鎖
System.out.println(
"
LockTest to addValue:
"
+
v
+
"
"
+
System.currentTimeMillis());
try
{
Thread.sleep(
1000
);
}
catch
(InterruptedException e)
{
}
this
.value
+=
v;
this
.addtimes
++
;
lock.unlock();
//
釋放鎖
}
public
double
getValue()
{
return
this
.value;
}
}
public
static
void
testLockTest()
throws
Exception
{
final
LockTest lockTest
=
new
LockTest();
//
新建任務1,調用lockTest的addValue方法
Runnable task1
=
new
Runnable()
{
public
void
run()
{
lockTest.addValue(
55.55
);
}
}
;
//
新建任務2,調用lockTest的getValue方法
Runnable task2
=
new
Runnable()
{
public
void
run()
{
System.out.println(
"
value:
"
+
lockTest.getValue());
}
}
;
//
新建任務執行服務
ExecutorService cachedService
=
Executors.newCachedThreadPool();
Future future
=
null
;
//
同時執行任務1三次,由于addValue方法使用了鎖機制,所以,實質上會順序執行
for
(
int
i
=
0
; i
<
3
; i
++
)
{
future
=
cachedService.submit(task1);
}
//
等待最后一個任務1被執行完
future.get();
//
再執行任務2,輸出結果
future
=
cachedService.submit(task2);
//
等待任務2執行完后,關閉任務執行服務
future.get();
cachedService.shutdownNow();
}
/** */
/**
* ReadWriteLock內置兩個Lock,一個是讀的Lock,一個是寫的Lock。
* 多個線程可同時得到讀的Lock,但只有一個線程能得到寫的Lock,
* 而且寫的Lock被鎖定后,任何線程都不能得到Lock。ReadWriteLock提供的方法有:
* readLock(): 返回一個讀的lock
* writeLock(): 返回一個寫的lock, 此lock是排他的。
* ReadWriteLockTest很適合處理類似文件的讀寫操作。
* 讀的時候可以同時讀,但不能寫;寫的時候既不能同時寫也不能讀。
*/
public
static
class
ReadWriteLockTest
{
//
鎖
ReadWriteLock lock
=
new
ReentrantReadWriteLock();
//
值
double
value
=
0d;
int
addtimes
=
0
;
/** */
/**
* 增加value的值,不允許多個線程同時進入該方法
*/
public
void
addValue(
double
v)
{
//
得到writeLock并鎖定
Lock writeLock
=
lock.writeLock();
writeLock.lock();
System.out.println(
"
ReadWriteLockTest to addValue:
"
+
v
+
"
"
+
System.currentTimeMillis());
try
{
Thread.sleep(
1000
);
}
catch
(InterruptedException e)
{
}
try
{
//
做寫的工作
this
.value
+=
v;
this
.addtimes
++
;
}
finally
{
//
釋放writeLock鎖
writeLock.unlock();
}
}
/** */
/**
* 獲得信息。當有線程在調用addValue方法時,getInfo得到的信息可能是不正確的。
* 所以,也必須保證該方法在被調用時,沒有方法在調用addValue方法。
*/
public
String getInfo()
{
//
得到readLock并鎖定
Lock readLock
=
lock.readLock();
readLock.lock();
System.out.println(
"
ReadWriteLockTest to getInfo
"
+
System.currentTimeMillis());
try
{
Thread.sleep(
1000
);
}
catch
(InterruptedException e)
{
}
try
{
//
做讀的工作
return
this
.value
+
"
:
"
+
this
.addtimes;
}
finally
{
//
釋放readLock
readLock.unlock();
}
}
}
public
static
void
testReadWriteLockTest()
throws
Exception
{
final
ReadWriteLockTest readWriteLockTest
=
new
ReadWriteLockTest();
//
新建任務1,調用lockTest的addValue方法
Runnable task_1
=
new
Runnable()
{
public
void
run()
{
readWriteLockTest.addValue(
55.55
);
}
}
;
//
新建任務2,調用lockTest的getValue方法
Runnable task_2
=
new
Runnable()
{
public
void
run()
{
System.out.println(
"
info:
"
+
readWriteLockTest.getInfo());
}
}
;
//
新建任務執行服務
ExecutorService cachedService_1
=
Executors.newCachedThreadPool();
Future future_1
=
null
;
//
同時執行5個任務,其中前2個任務是task_1,后兩個任務是task_2
for
(
int
i
=
0
; i
<
2
; i
++
)
{
future_1
=
cachedService_1.submit(task_1);
}
for
(
int
i
=
0
; i
<
2
; i
++
)
{
future_1
=
cachedService_1.submit(task_2);
}
//
最后一個任務是task_1
future_1
=
cachedService_1.submit(task_1);
//
這5個任務的執行順序應該是:
//
第一個task_1先執行,第二個task_1再執行;這是因為不能同時寫,所以必須等。
//
然后2個task_2同時執行;這是因為在寫的時候,就不能讀,所以都等待寫結束,
//
又因為可以同時讀,所以它們同時執行
//
最后一個task_1再執行。這是因為在讀的時候,也不能寫,所以必須等待讀結束后,才能寫。
//
等待最后一個task_2被執行完
future_1.get();
cachedService_1.shutdownNow();
}
public
static
void
main(String[] args)
throws
Exception
{
Lockers.testLockTest();
System.out.println(
"
---------------------
"
);
Lockers.testReadWriteLockTest();
}
}
--
學海無涯
Powered by:
BlogJava
Copyright © 啥都寫點
主站蜘蛛池模板:
亚洲H在线播放在线观看H
|
亚洲日本中文字幕
|
久久人午夜亚洲精品无码区
|
在线观看H网址免费入口
|
久久亚洲AV无码精品色午夜
|
99久久久国产精品免费牛牛四川
|
免费国产黄网站在线看
|
国产成人免费ā片在线观看
|
国产精品自拍亚洲
|
国产成人精品久久亚洲
|
中文字幕在线免费播放
|
亚洲成人动漫在线
|
2021免费日韩视频网
|
亚洲精品天堂成人片AV在线播放
|
免费看大美女大黄大色
|
草久免费在线观看网站
|
亚洲成av人片天堂网
|
日本片免费观看一区二区
|
亚洲一卡2卡3卡4卡乱码 在线
|
国产又大又粗又硬又长免费
|
一级特黄a免费大片
|
亚洲av网址在线观看
|
日韩精品无码区免费专区
|
美女视频免费看一区二区
|
亚洲一区二区三区无码中文字幕
|
日韩精品久久久久久免费
|
亚洲色大成网站www永久男同
|
亚洲国产成人精品91久久久
|
国产激情免费视频在线观看
|
好男人看视频免费2019中文
|
日日夜夜精品免费视频
|
国产精品免费αv视频
|
久久精品国产精品亚洲毛片
|
日韩一级在线播放免费观看
|
一级视频在线免费观看
|
亚洲资源在线观看
|
四虎影视在线永久免费看黄
|
久操免费在线观看
|
亚洲妇女无套内射精
|
久久久无码精品亚洲日韩蜜桃
|
午夜视频在线在免费
|