当前位置: 首页 > 后端技术 > Java

极客专栏打包-实时更新附资料文档

时间:2023-04-02 09:33:17 Java

鏋佸涓撴爮鎵撳寘-瀹炴椂鏇存柊闄勮祫鏂欐枃妗d笅杞藉湴鍧€锛氱櫨搴︾綉鐩樹粠鏃犲埌鏈夎嚜宸卞啓鑷棆閿佸湪鎴戜滑鍐欏苟鍙戠▼搴忕殑鏃跺€欙紝涓€涓緢涓€涓父瑙佺殑闇€姹傛槸淇濊瘉鍦ㄦ煇涓椂鍒诲彧鏈変竴涓嚎绋嬫墽琛屾煇娈典唬鐮併€傝繖绉嶄唬鐮佺О涓轰复鐣屽尯锛岄€氬父淇濊瘉涓€娆″彧鏈変竴涓嚎绋嬫墽琛屼复鐣屽尯浠g爜鐨勬柟寮忔槸閿侌煍掋€傚湪鏈枃涓紝鎴戜滑灏嗕粩缁嗗垎鏋愬拰瀛︿範鑷棆閿併€傛墍璋撹嚜鏃嬮攣鏄€氳繃涓€涓獁hile寰幆瀹屾垚鐨勶紝璁╂嫢鏈夐攣鐨勭嚎绋嬭繘鍏ヤ复鐣屽尯鎵ц浠g爜锛岃娌℃湁閿佺殑绾跨▼鍋滄whiledead寰幆锛岃繖鍏跺疄灏辨槸绾跨▼鏈韩鍦╳hile寰幆涓€滆嚜鏃嬧€濓紝鎵€浠ヨ繖绉嶉攣绉颁负鑷棆閿併€傚師瀛愭€у湪璇磋嚜鏃嬮攣涔嬪墠杩樺緱鍏堣璇村師瀛愭€с€傛墍璋撳師瀛愭€э紝绠€鍗曠殑璇村氨鏄竴涓搷浣滆涔堜笉鍋氾紝瑕佷箞鍏ㄩ儴鍋氥€俤oingall鐨勬剰鎬濆氨鏄湪杩愯杩囩▼涓笉鑳借鎵撴柇銆傛瘮濡傜粰鍙橀噺鏁版嵁鍔犱竴锛屽垎涓夋锛氭暟鎹粠鍐呭瓨鍔犺浇鍒板瘎瀛樺櫒銆傚皢鏁版嵁鐨勫€煎鍔?銆傚皢寰楀埌鐨勭粨鏋滃啓鍥炲唴瀛樸€傚師瀛愭€ф槸鎸囦竴涓嚎绋嬪湪鎵ц鍔犱竴鎿嶄綔鏃朵笉鑳借鍏朵粬绾跨▼鎵撴柇銆傚彧鏈夌嚎绋嬪畬鎴愯繖涓変釜杩囩▼锛屽叾浠栫嚎绋嬫墠鑳藉鏁版嵁杩涜鎿嶄綔銆傜幇鍦ㄥ氨鐢ㄤ唬鐮佹潵浣撻獙涓€涓嬪惂銆傚湪Java涓紝鎴戜滑鍙互浣跨敤AtomicInteger瀵规暣鍨嬫暟鎹繘琛屽師瀛愭搷浣滐細importjava.util.concurrent.atomic.AtomicInteger;鍏叡绫籄tomicDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{AtomicIntegerdata=newAtomicInteger();data.set(0);//鍒濆鍖栨暟鎹綅0Threadt1=newThread(()->{for(inti=0;i<100000;i++){data.addAndGet(1);//浠ュ師瀛愭柟寮忓皢1鍔犲埌鏁版嵁data}});Threadt2=newThread(()->{for(inti=0;i<100000;i++){data.addAndGet(1);//鍋滄瀵规暟鎹甦ata鐨勫師瀛愬姞1鎿嶄綔}});//鍚姩涓や釜绾跨▼t1.start();t2.start();//绛夊緟涓や釜绾跨▼瀹屾垚t1.join();t2.join();//鎵撳嵃鏈€缁堢粨鏋淪ystem.out.println(data);//200000}}澶嶅埗浠g爜浠庝笂闈㈢殑浠g爜鍒嗘瀽鎴戜滑鍙互鐭ラ亾锛屽鏋滄槸涓€涓櫘閫氱殑鏁村瀷鍙橀噺锛屽鏋滀袱涓嚎绋嬪悓鏃舵搷浣滐紝鏈€鍚庣殑缁撴灉浼氬皬浜?00000銆傛垜寮€濮嬪啓浜嗚嚜鏃嬮攣AtomicInteger绫汇€備簡瑙d簡鍘熷瓙鎬х殑浣滅敤涔嬪悗锛屾垜浠幇鍦ㄤ簡瑙tomicInteger绫荤殑鍙︿竴涓師瀛愭搷浣溾€斺€攃ompareAndSet銆傛鎿嶄綔绉颁负姣旇緝鍜屼氦鎹?CAS)锛屽畠鏄師瀛愮殑銆?publicstaticvoidmain(String[]args){AtomicIntegeratomicInteger=newAtomicInteger();atomicInteger.set(0);atomicInteger.compareAndSet(0,1);}澶嶅埗浠g爜compareAndSet鍑芥暟鐨勫惈涔夛細棣栧厛浼氭瘮杈冪涓€涓弬鏁帮紙瀵瑰簲涓婇潰浠g爜涓?锛夊拰atomicInteger鐨勫€硷紝濡傛灉鐩哥瓑鍒欏仠姝㈤€氫俊锛屽嵆璁剧疆atomicInteger鐨勫€间负绗簩涓弬鏁帮紙瀵瑰簲涓婇潰浠g爜涓?锛夛紝濡傛灉杩欎簺鎿嶄綔鎴愬姛锛屽垯compareAndSet鍑芥暟杩斿洖true锛屽鏋滄搷浣滃け璐ワ紝鍒欒繑鍥瀎alse锛屾搷浣滃け璐ュ彲鑳芥槸鍥犱负璇ュ€肩涓€涓弬鏁帮紙鏈熸湜鍊硷級鐨勪笉绛変簬atomicInteger锛屽鏋滅浉绛夛紝涔熷彲鑳芥槸鍥犱负淇敼atomicInteger鐨勫€兼椂澶辫触锛堝洜涓篛peration涓彲鑳芥湁澶氫釜绾跨▼锛岀敱浜庡師瀛愭€х殑瀛樺湪锛屽彧鏈変竴涓嚎绋嬫搷浣滃彲浠ヨ幏鑳滐級銆傝嚜鏃嬮攣鐨勫疄鐜板師鐞嗘垜浠彲浠ヤ娇鐢ˋtomicInteger绫绘潵瀹炵幇鑷棆閿併€傛垜浠彲浠ョ敤0鍊艰〃绀鸿В閿侊紝1鍊艰〃绀哄凡缁忎笂閿併€侫tomicInteger绫荤殑鍒濆鍊间负0锛屽湪鍔犻攣鐨勬椂鍊欙紝鎴戜滑鍙互浣跨敤浠g爜atomicInteger.compareAndSet(0,1)鏉ュ畬鎴愩€傚墠闈㈡垜浠彁鍒板彧鏈変竴涓嚎绋嬪彲浠ュ畬鎴愯繖涓搷浣滐紝涔熷氨鏄鍙湁涓€涓嚎绋嬪彲浠ヨ皟鐢ㄨ繖琛屼唬鐮佸苟杩斿洖true锛屽叾浠栫嚎绋嬮兘杩斿洖false锛岃€岃繖浜涜繑鍥瀎alse鐨勭嚎绋嬫槸涓嶈兘杩涘叆涓寸晫鍖虹殑锛屾墍浠ユ垜浠渶瑕佽繖浜泃hreadstostopatatomicInteger.compareAndSet(0,1)杩欒浠g爜涓嶈兘鍐嶇户缁墽琛屼簡锛屾垜浠彲浠ヤ娇鐢╳hile寰幆璁╄繖浜涚嚎绋嬩笉鏂殑鍋滃湪杩欓噷while(!value.compareAndSet(0,1));锛屽彧鏈夎繑鍥瀟rue鐨勭嚎绋嬪彲浠ヨ烦鍑哄惊鐜紝鍏朵粬绾跨▼浼氱户缁湪杩欓噷寰幆銆傛垜浠О杩欑琛屼负涓鸿嚜鏃嬶紝杩欑閿佷篃鍥犳涔熺О涓鸿嚜鏃嬮攣銆傚綋绾跨▼閫€鍑轰复鐣屽尯鏃讹紝闇€瑕侀噸鏂拌皟鏁撮攣鐘舵€佷负瑙i攣鐘舵€併€傛垜浠彲浠ヤ娇鐢ㄤ唬鐮乿alue.compareAndSet(1,0);灏嗛攣瀹氱姸鎬佹仮澶嶅埌瑙i攣鐘舵€併€傝繖鏍峰叾浠栬嚜鏃嬬嚎绋嬪氨鍙互鎷垮埌閿佽繘鍏ヤ复鐣屽尯銆傝嚜鏃嬮攣浠g爜琛ュ叏importjava.util.concurrent.atomic.AtomicInteger;publicclassSpinLock{//0琛ㄧず瑙i攣鐘舵€?/1琛ㄧず閿佸畾鐘舵€乸rotectedAtomicIntegervalue;publicSpinLock(){this.value=newAtomicInteger();//璁剧疆value鐨勫垵濮嬪€间负0琛ㄧず瑙i攣鐘舵€乼his.value.set(0);}publicvoidlock(){//鍋滄鑷棆鎿嶄綔while(!value.compareAndSet(0,1));}publicvoidunlock(){//璁剧疆閿佺殑鐘舵€佷负瑙i攣鐘舵€乿alue.compareAndSet(1,0);}}澶嶅埗浠g爜涓婇潰鏄笂闈㈡垜浠畬鎴愮殑鑷棆閿佺殑浠g爜锛岀湅璧锋潵鐪熺殑鏄お绠€鍗曚簡锛屼絾鏄‘瀹炲府鍔╂垜浠疄鐜颁簡涓€涓攣锛屽苟涓斿彲浠ュ湪瀹為檯鍦烘櫙涓娇鐢ㄣ€傜幇鍦ㄦ垜浠敤浠g爜鏉ユ祴璇曚竴涓嬫垜浠笂闈㈠啓鐨勯攣銆傛祴璇曠▼搴忥細publicclassSpinLockTest{publicstaticintdata;publicstaticSpinLocklock=newSpinLock();publicstaticvoidadd(){for(inti=0;i<100000;i++){//閿佸彧鑳芥湁涓€涓嚎绋嬫墽琛宒ata++鎿嶄綔锛屽叾浠栫嚎绋嬪彧鑳藉仠姝hile寰幆lock.lock();鏁版嵁++锛沴ock.unlock();}}publicstaticvoidmain(String[]args)throwsInterruptedException{Thread[]threads=newThread[100];//璁剧疆100涓嚎绋媐or(inti=0;i<100;i++){threads[i]=newThread(SpinLockTest::add);}//鍚姩100涓嚎绋媐or(inti=0;i<100;i++){threads[i].start();}//绛夊緟瀵逛簬杩?00涓嚎绋嬪畬鎴恌or(inti=0;i<100;i++){threads[i].join();}System.out.println(data);//10000000}}澶嶅埗浠g爜鍦ㄤ笂闈㈢殑浠g爜鍒楄〃涓紝鎴戜滑浣跨敤浜?00涓嚎绋嬶紝鐒跺悗姣忎釜绾跨▼寰幆鎵ц100000娆ata++鎿嶄綔銆備笂闈唬鐮佹渶缁堣緭鍑?0000000绛変簬鎴戜滑绛夊緟鐨勭粨鏋滐紝璇存槑鎴戜滑瀹屾垚鐨勮嚜鏃嬮攣鏄纭殑銆傛垜寮€濮嬬紪鍐欏彲閲嶅叆鑷棆閿併€備笂闈㈠疄鐜扮殑鍙噸鍏ヨ嚜鏃嬮攣宸茬粡鍙互婊¤冻鎴戜滑鐨勪竴浜涘熀鏈渶姹傦紝鍗充竴娆″彧鑳芥湁涓€涓嚎绋嬫墽琛屼复鐣屽尯涓殑浠g爜銆備絾鏄笂闈㈢殑浠g爜涓嶈兘婊¤冻鍙噸鍏ョ殑瑕佹眰锛屼篃灏辨槸璇翠笂闈㈠啓鐨勮嚜鏃嬮攣涓嶆槸鍙噸鍏ョ殑鑷棆閿併€傚疄闄呬笂锛屽湪涓婇潰瀹屾垚鐨勮嚜鏃嬮攣涓噸鍏ヤ細浜х敓姝婚攣銆傛垜浠敤涓€娈典唬鐮佹潵妯℃嫙涓婇潰閲嶅叆瀵艰嚧鐨勬閿侊細publicstaticvoidadd(intstate)throwsInterruptedException{TimeUnit.SECONDS.sleep(1);濡傛灉锛堢姸鎬?=3锛墈lock.lock();System.out.println(Thread.currentThread().getName()+"\tEntercriticalsectionstate="+state);for(inti=0;i<10;i++)data++;add(state+1);//鍦ㄩ攣鐘舵€佷负1涔嬪墠鍋滄閫掑綊閲嶅叆锛屽洜涓烘湰绾跨▼宸茬粡杩涘叆涓寸晫鍖簂ock.unlock();}}澶嶅埗浠g爜涓婇潰浠g爜涓紝灏嗘垜浠紶鍏ョ殑鍙傛暟state鐨勫€煎姞涓?锛岀劧鍚庯紝濡傛灉绾跨▼鎵цfor寰幆鍚庡啀娆¢€掑綊璋冪敤add鍑芥暟锛屽垯state鐨勫€煎彉涓?锛屽鏋滄潯浠朵粛鐒舵弧瓒筹紝鍒欐湰绾跨▼涔熼渶瑕侀噸鏂拌幏鍙栭攣锛屼絾姝ゆ椂閿佺姸鎬佷负1銆佽繖涓嚎绋嬪凡缁忚幏鍙栬繃涓€娆¢攣锛屼絾鏄瓑寰呰嚜鏃嬮攣鐨勯攣鐘舵€佷负0锛屽洜涓哄彧鏈夎繖鏍蜂粬鎵嶈兘鍐嶆鑾峰彇閿佸苟杩涘叆涓寸晫鍖猴紝浣嗘槸鐜板湪閿佺姸鎬佷负1锛屼篃灏辨槸璇磋繖涓嚎绋嬭櫧鐒惰幏寰椾簡涓€娆¢攣锛屼絾鏄細鍋滄while寰幆锛屾案杩滀笉浼氬嚭鍘伙紝杩欏氨鏋勬垚浜嗘閿併€傚彲閲嶅叆鑷棆閿佺殑鎬濊矾閽堝浠ヤ笂鎯呭喌锛屾垜浠渶瑕佸畬鎴愪竴涓彲閲嶅叆鑷棆閿併€傛垜浠殑鎬濊矾澶ц嚧鏄繖鏍风殑锛氬湪鎴戜滑瀹屾垚鐨勮嚜鏃嬮攣涓紝鍙互娣诲姞涓や釜鍙橀噺锛宱wner涓€涓敤鏉ヤ繚瀛樺綋鍓嶆嫢鏈夐攣鐨勭嚎绋嬶紝count璁板綍褰撳墠绾跨▼杩涘叆閿佺殑娆℃暟銆傚鏋滅嚎绋嬭幏寰椾簡閿侊紝owner=Thread.currentThread()andcount=1銆傚綋绾跨▼涓嬫瑕佽幏寰楅攣鏃讹紝鍏堟鏌wner鏄惁鎸囧悜鑷繁锛岀劧鍚庣户缁惊鐜搷浣滐紝濡傛灉鏄紝鐩存帴鎵цcount++鎿嶄綔锛岀劧鍚庤繘鍏ヤ复鐣屽尯銆傚綋鎴戜滑閫€鍑轰复鐣屽尯鐨勬椂鍊欙紝濡傛灉count澶т簬1锛屽氨璇存槑绾跨▼閲嶆柊杩涘叆浜嗛攣锛屾墍浠ユ垜浠笉鑳界洿鎺ユ妸閿佺疆0锛屼篃灏辨槸瑙i攣鐘舵€併€傝繖绉嶆儏鍐电洿鎺ユ墽琛宑ount--鎿嶄綔锛屽鏋渃ount绛変簬1锛岃鏄庣嚎绋嬪綋鍓嶇姸鎬佷笉鏄彲閲嶅叆鐘舵€侊紙閲嶅叆鍚庡彲鑳戒細閫掑綊杩斿洖锛夛紝鎵€浠ラ攣鐨勭姸鎬侀渶瑕佸湪閫€鍑轰复鐣屽尯鍓嶈缃负0锛屽嵆涓嶅姞閿併€備互渚垮叾浠栫嚎绋嬪彲浠ヨ幏鍙栭攣銆傞噸鍏ラ攣浠g爜瀹屾垚锛氬畬鎴愮殑閲嶅叆閿佷唬鐮佸涓嬶細publicclassReentrantSpinLockextendsSpinLock{privateThreadowner;privateintcount;@Overridepublicvoidlock(){if(owner==null||owner!=Thread.currentThread()){while(!value.compareAndSet(0,1));owner=Thread.currentThread();count=1;}else{count++;}}@Overridepublicvoidunlock(){if(count==1){count=0;value.compareAndSet(1,0);}elsecount--;}}澶嶅埗浠g爜涓嬮潰鎴戜滑鐢ㄩ€掑綊绋嬪簭鏉ラ獙璇佹垜浠啓鐨勫彲閲嶅叆鑷棆閿佹槸鍚﹁兘鎴愬姛銆傛祴璇曠▼搴忥細importjava.util.concurrent.TimeUnit;publicclassReentrantSpinLockTest{publicstaticintdata;publicstaticReentrantSpinLocklock=newReentrantSpinLock();publicstaticvoidadd(intstate)throwsInterruptedException{TimeUnit.SECONDS.sleep(1);if(state<=3){lock.lock();System.out.println(Thread.currentThread().getName()+"\t杩涘叆涓村鍖簊tate="+state);瀵逛簬(inti=0;i<10;i++)鏁版嵁++;娣诲姞锛堢姸鎬?1锛夛紱lock.unlock();}}publicstaticvoidmain(String[]args)throwsInterruptedException{Thread[]threads=newThread[10];for(inti=0;i<10;i++){threads[i]=newThread(newThread(()->{try{ReentrantSpinLockTest.add(1);}catch(InterruptedExceptione){e.printStackTrace();}},String.valueOf(i)));}for(inti=0;i<10;i++){threads[i].start();}for(inti=0;i<10;i++){threads[i].join();}System.out.println(data);}}澶嶅埗浠g爜涓婇潰绋嬪簭鐨勮緭鍑猴細Thread-3杩涘叆涓寸晫鍖簊tate=1Thread-3杩涘叆涓寸晫鍖虹姸鎬?2Thread-3杩涘叆涓寸晫鍖虹姸鎬?3Thread-0杩涘叆涓寸晫鍖虹姸鎬?1Thread-0杩涘叆涓寸晫鍖虹姸鎬?2Thread-0杩涘叆涓寸晫鍖虹姸鎬?3Thread-9杩涘叆涓寸晫鍖虹姸鎬?1Thread-9杩涘叆涓寸晫鍖虹姸鎬?2Thread-9杩涘叆涓寸晫鍖虹姸鎬?3Thread-4杩涘叆涓寸晫鍖虹姸鎬?1Thread-4杩涘叆涓寸晫鍖虹姸鎬?2Thread-4杩涘叆涓寸晫鍖虹姸鎬?3Thread-7杩涘叆涓寸晫鍖虹姸鎬?1Thread-7杩涘叆涓寸晫鍖虹姸鎬?2Thread-7杩涘叆涓寸晫鍖虹姸鎬?3Thread-8杩涘叆涓寸晫鍖虹姸鎬?1Thread-8杩涘叆涓寸晫鍖虹姸鎬?2Thread-8杩涘叆涓寸晫鍖虹姸鎬?3Thread-5杩涘叆涓寸晫鍖虹姸鎬?1Thread-5杩涘叆涓寸晫鍖虹姸鎬乻tate=2Thread-5杩涘叆涓寸晫鍖簊tate=3Thread-2杩涘叆涓寸晫鍖簊tate=1Thread-2杩涘叆涓寸晫鍖簊tate=2Thread-2杩涘叆涓寸晫鍖簊tate=3Thread-6杩涘叆涓寸晫鍖簊tate=1Thread-6杩涘叆涓寸晫鍖簊tate=2Thread-6杩涘叆涓寸晫鍖虹姸鎬?3Thread-1杩涘叆涓寸晫鍖虹姸鎬?1Thread-1杩涘叆涓寸晫鍖虹姸鎬?2Thread-1杩涘叆涓寸晫鍖虹姸鎬?3300澶嶅埗浠g爜浠庝笂闈㈢殑杈撳嚭鎴戜滑鍙互鐭ラ亾锛屽綋涓€涓嚎绋嬪彲浠ユ嬁鍒伴攣鐨勬椂鍊欏氨鍙互鍋滄閲嶅叆锛屾渶鍚庤緭鍑虹殑缁撴灉涔熸槸姝g‘鐨勶紝鎵€浠ラ獙璇佷簡鎴戜滑鍐欑殑鍙噸鍏ヨ嚜鏃嬮攣鏄湁鏁堢殑锛佸皬缁撳湪杩欑瘒鏂囩珷涓紝鎴戜富瑕佷粙缁嶄簡鑷棆閿佸拰鍙噸鍏ヨ嚜鏃嬮攣鐨勫師鐞嗭紝骞跺啀娆″畬鎴愩€傚叾瀹炰唬鐮佹瘮杈冪畝鍗曘€傚叧閿槸澶у闇€瑕佹槑鐧藉叾涓殑閫昏緫锛氭墍璋撹嚜鏃嬮攣灏辨槸while寰幆缁撴潫鍚庯紝璁╂嬁鍒伴攣鐨勭嚎绋嬭繘鍏ヤ复鐣屽尯鎵ц浠g爜锛岃娌℃湁鑾峰緱閿佺殑绾跨▼鍋滄锛屾寰幆鍙互閲嶅叆銆傞噸鍏ョ殑鎰忔€濇槸涓€涓嚎绋嬫浘缁忕珵浜夎繃涓€鎶婇攣銆傜珵浜夊畬杩欎釜閿佸悗锛岄渶瑕侀噸鏂拌繘鍏ヤ复鐣屽尯浠g爜銆傚鏋滆繖涓嚎绋嬪彲浠ヤ繚璇佸彲浠ラ噸鏂拌繘鍏ヤ复鐣屽尯锛岃繖灏卞彨鍋氬彲閲嶅叆銆傛垜浠湪瀹炵幇鑷棆閿佺殑鏃跺€欙紝浣跨敤鐨勬槸AtomicInteger绫伙紝鎴戜滑浣跨敤0鍜?杩欎袱涓€兼潵琛ㄧず鏃犻攣鍜岄攣琚崰鐢ㄤ袱绉嶇姸鎬併€傚湪鑾峰彇閿佺殑鏃跺€欙紝鎴戜滑浣跨敤while寰幆涓嶆柇鐨勮繘琛孋AS鎿嶄綔銆傜洿鍒版搷浣滄垚鍔熻繑鍥瀟rue锛岄噴鏀鹃攣鏃朵娇鐢–AS灏嗛攣鐨勭姸鎬佷粠1鍙樹负0銆傚疄鐜板彲閲嶅叆閿佹渶閲嶈鐨勬槸闇€瑕佽褰曟槸鍝釜绾跨▼鑾峰緱浜嗛攣锛岃繕闇€瑕佽褰曡幏寰椾簡澶氬皯娆¢攣锛屽洜涓烘垜浠渶瑕佸湪瑙i攣鐨勬椂鍊欒繘琛屽垽鏂紝鐒跺悗count鐨勭姸鎬?1鍙互灏嗛攣Set鐨勭姸鎬佷粠1鍙樹负0銆?/p>

最新推荐
猜你喜欢