锘??xml version="1.0" encoding="utf-8" standalone="yes"?>wait
銆?code>notify 鍜?notifyAll
錛夊垎瑙f垚鎴劧涓嶅悓鐨勫璞★紝浠ヤ究閫氳繃灝嗚繖浜涘璞′笌浠繪剰 Lock
瀹炵幇緇勫悎浣跨敤錛屼負姣忎釜瀵硅薄鎻愪緵澶氫釜絳夊緟 set 錛坵ait-set錛夈傚叾涓紝Lock 鏇夸唬浜?synchronized 鏂規硶鍜岃鍙ョ殑浣跨敤錛?tt>Condition 鏇夸唬浜?Object 鐩戣鍣ㄦ柟娉曠殑浣跨敤銆?
涓嬮潰瑙i噴涓?font face="Courier New">Condition api閲岄潰鐨勪緥瀛?鐢熶駭鑰咃紝娑堣垂鑰?錛?br />
public class ConditionTest {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition(); //鐢熶駭鑰呯殑鍓嶆彁鏉′歡錛屾病鏈夎揪鍒版鏉′歡灝遍樆濉?br /> final Condition notEmpty = lock.newCondition(); //娑堣垂鑰呯殑鍓嶆彁鏉′歡錛屾病鏈夎揪鍒版鏉′歡灝遍樆濉?br />
final Object[] items = new Object[100];
int putptr, takeptr, count;
//鐢熶駭
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)//濡傛灉婊′簡錛屽氨璁╅渶瑕佹潯浠朵負錛氭病婊$殑鐨勭嚎紼?鐢熶駭鑰?絳?br /> notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();//濡傛灉宸茬粡鐢熶駭浜嗭紝灝辮闇瑕佹潯浠朵負涓嶄負絀虹殑綰跨▼(娑堣垂鑰?鎵ц
} finally {
lock.unlock();
}
}
//娑堣垂
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)//濡傛灉涓虹┖灝辮闇瑕佹潯浠朵負涓嶄負絀虹殑綰跨▼(娑堣垂鑰?絳?br /> notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();//濡傛灉娑堣垂浜嗭紝灝辮鏉′歡涓轟笉婊$殑綰跨▼(鐢熶駭鑰?鎵ц
return x;
} finally {
lock.unlock();
}
}
}
public class RreadWriteLockTest {
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
public int i = 0;
//璇誨彇
public void read() throws InterruptedException{
readWriteLock.readLock().lock();//鑾峰彇璇婚攣
System.out.println("read thread:"+Thread.currentThread().getName());
Thread.sleep(10000);
System.out.println("read:"+i);
readWriteLock.readLock().unlock();
}
//鍐欏叆
public void write() throws InterruptedException{
readWriteLock.writeLock().lock();//鑾峰彇鍐欓攣
System.out.println("write thread:"+Thread.currentThread().getName());
Thread.sleep(10000);
i = 2;
System.out.println("write:"+i);
readWriteLock.writeLock().unlock();
}
}
嫻嬭瘯浠g爜錛?br />1 嫻嬭瘯涓や釜鍚屾椂璇葷殑錛岀粨鏋滈兘鑳藉悓鏃惰鍙栥?br />2 嫻嬭瘯涓涓錛屼竴涓啓鐨勶紝闇瑕佸叾涓竴涓噴鏀鵑攣涔嬪悗鎵嶈兘榪涜鍙﹀涓涓搷浣?br />public static void main(String[] args) throws InterruptedException {
final RreadWriteLockTest lockTest= new RreadWriteLockTest();
new Thread(new Runnable() {
@Override
public void run() {
try {
lockTest.write();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
Thread.sleep(2000);
new Thread(new Runnable() {
@Override
public void run() {
try {
lockTest.read();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
鎵撳嵃濡備笅錛?br />write thread:Thread-0鎵ц瀹屼箣鍚?10縐掍箣鍚?鎵嶆墽琛宺ead thread:Thread-1
娉ㄦ剰錛氭墽琛屽畬浠ュ悗涓瀹氳鎵цunlock錛岃涓峫ock鐨勮鏁版病鏈?1錛岃繖鏍峰搴攔ead鎴栬厀rite鐨勬搷浣滃皢鏃犳硶榪涜錛屼竴鐩寸瓑寰呫?/span>
涓句緥鏉ヨ錛?/p>
public synchronized void method(){
method body
}
絳変環浜?/p>
public void method(){
this.intrinsicLock.lock();
try{
method body;
}finally(){
this.intrinsicLock.unlock();
}
}
浠庝笂闈㈢殑浠g爜紺轟緥鍙互鐪嬪嚭錛宻ynchronized鐨勪嬌鐢ㄦ柟寮忔槸姣旇緝綆鍗曠殑銆傝繖涔熷鑷翠簡澶ч噺鐨勫垵瀛﹁呭湪紕板埌java緙栫▼鐨勬椂鍊欒惤鍏ラ櫡闃遍噷錛岃涓烘棦鐒秙ynhronized鍙互鎼炲畾涓鍒囷紝閭d箞涓嶇涓変竷浜屽崄涓錛屽彧瑕佹湁騫跺彂鍙兘鎬х殑鍦版柟錛屽氨鍔犱笂synchronized鐨勫叧閿瓧錛岃繖鏄劇劧鏄笉瀵圭殑銆傚湪java瀵硅薄涓紝榪欎釜java瀵硅薄鍙湁榪欎竴涓唴閮ㄩ攣錛屽叾涓竴涓猻ynchronized鏂規硶鑾峰彇鍒頒簡榪欎釜閿侊紝鍙﹀涓涓猻ynchronized鏂規硶鐨勮皟鐢ㄥ皢琚樆濉炪?/p>
鍗?/p>
class sync{
public synchronized void methodA(){};
public synchronized void methodB(){};
... ...
}
methodA 鍜宮ethodB鍦ㄥ垵濮嬪氨鏄簰鏂ョ殑錛屽鏋渕ethodA鍜宮ethodB榪涘叆浜掔浉絳夊緟錛屽氨寰堝鏄撳嚭鐜版閿佺殑鎯呭喌銆傞偅濡傛灉紕板埌榪欑鎯呭喌錛屽簲璇ユ庝箞鍋氫簡錛熷父鐢ㄧ殑鏂瑰紡鏄湪鏂規硶鍐呴儴鏂板緩涓涓棤鎰忎箟鐨勫璞★紝鐒跺悗瀵硅繖涓棤鎰忎箟鐨勫璞″姞閿呫?/p>
鍙﹀闇瑕佹敞鎰忕殑鏄皢闈欐佺被澹版槑涓簊ynchronized鏂規硶涔熸槸鍚堟硶鐨勩備婦渚嬫潵璇達紝濡傛灉Sync鏈変竴涓猻tatic synchronized鏂規硶錛岄偅涔堣繖涓柟娉曡璋冪敤鏃?bank.class榪欎釜綾誨璞℃湰韜湪jvm涓皢琚攣浣?/p>
AtomicInteger錛屼竴涓彁渚涘師瀛愭搷浣滅殑Integer鐨勭被銆傚湪Java璇█涓紝++i鍜宨++鎿嶄綔騫朵笉鏄嚎紼嬪畨鍏ㄧ殑錛屽湪浣跨敤鐨勬椂鍊欙紝涓嶅彲閬垮厤鐨勪細鐢ㄥ埌synchronized鍏抽敭瀛椼傝孉tomicInteger鍒欓氳繃涓縐嶇嚎紼嬪畨鍏ㄧ殑鍔犲噺鎿嶄綔鎺ュ彛銆?/p>
鏉ョ湅AtomicInteger鎻愪緵鐨勬帴鍙c?/p>
//鑾峰彇褰撳墠鐨勫?/p>
public final int get()
//鍙栧綋鍓嶇殑鍊鹼紝騫惰緗柊鐨勫?/p>
public final int getAndSet(int newValue)
//鑾峰彇褰撳墠鐨勫鹼紝騫惰嚜澧?/p>
public final int getAndIncrement()
//鑾峰彇褰撳墠鐨勫鹼紝騫惰嚜鍑?/p>
public final int getAndDecrement()
//鑾峰彇褰撳墠鐨勫鹼紝騫跺姞涓婇鏈熺殑鍊?/p>
public final int getAndAdd(int delta)
... ...
鎴戜滑鍦ㄤ笂涓鑺傛彁鍒扮殑CAS涓昏鏄繖涓や釜鏂規硶
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
public final boolean weakCompareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
榪欎袱涓柟娉曟槸鍚嶇О涓嶅悓錛屼絾鏄仛鐨勪簨鏄竴鏍風殑錛屽彲鑳藉湪鍚庣畫鐨刯ava鐗堟湰閲岄潰浼氭樉紺哄嚭鍖哄埆鏉ャ?/p>
璇︾粏鏌ョ湅浼氬彂鐜幫紝榪欎袱涓帴鍙i兘鏄皟鐢ㄤ竴涓猽nsafe鐨勭被鏉ユ搷浣滐紝榪欎釜鏄氳繃JNI瀹炵幇鐨勬湰鍦版柟娉曪紝緇嗚妭灝變笉鑰冭檻浜嗐?/p>
涓嬮潰鏄竴涓姣旀祴璇曪紝鎴戜滑鍐欎竴涓猻ynchronized鐨勬柟娉曞拰涓涓狝tomicInteger鐨勬柟娉曟潵榪涜嫻嬭瘯錛岀洿瑙傜殑鎰熷彈涓嬫ц兘涓婄殑宸紓
緇撴灉
time elapse:31
time elapse:16
鐢辨涓嶉毦鐪嬪嚭錛岄氳繃JNI鏈湴鐨凜AS鎬ц兘榪滆秴synchronized鍏抽敭瀛?/p>
Reference
http://stackoverflow.com/questions/2443239/java-atomicinteger-what-are-the-differences-between-compareandset-and-weakcompar