一定要会的synchronized关键字的用法
生活随笔
收集整理的這篇文章主要介紹了
一定要会的synchronized关键字的用法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
synchronized(同步)關(guān)鍵字
修飾方法
修飾代碼塊,鎖的是synchronized括號里的對象
public class SyncDemo1 {//修飾普通方法public synchronized void method(){}//修飾靜態(tài)方法public static synchronized void staticMethod(){}public void someMethod(){//同步代碼塊//這里o是局部變量,外部不可能拿到,這種加鎖是毫無意義的Object o = new Object();synchronized (o){//o這個引用不能為null}}}synchronized是如何實現(xiàn)加鎖的?-----以同步代碼塊為例
java中的所有對象在jvm實現(xiàn)的時候,內(nèi)部都包含一把鎖,這把鎖默認情況下是打開的。
對象可以調(diào)用getClass()方法從對象拿到該對象的“類對象”。
同步代碼塊的理解
synchronized(ref){//加鎖一些語句;//加鎖成功才能執(zhí)行 }//釋放鎖普通同步方法的理解
//修飾普通方法public synchronized void method(){}//效果同上public void method1(){synchronized (this){}}靜態(tài)同步方法的理解
//修飾靜態(tài)方法public static synchronized void staticMethod(){}//效果同上public void staticMethod1(){synchronized (SyncDemo1.class){}}獲取關(guān)于類的對象
如果加鎖失敗,會怎么辦?
(會觸發(fā)線程調(diào)度隱含著必須執(zhí)行操縱系統(tǒng)的代碼才能完成這個工作,所有會有切換內(nèi)核態(tài)的操作)
易錯點
哪些情況下會導(dǎo)致兩個線程之間產(chǎn)生互斥
public class SyncDemo2 {//沒加鎖void method1() {}//鎖的時synchronized void method2() {}static synchronized void method3() {}void method4() {synchronized (this) {}}static void method5() {synchronized (SyncDemo2.class) {}}void method6() {synchronized (SyncDemo2.class) {}}}改造n++和n–操作,使得線程安全
只要保證同時加鎖,加得是同一把鎖,哪個對象都可以
鎖得粒度會影響運行效率。
當線程A在操作訪問鎖定的對象時候, 線程B如果要進入synchronized代碼塊執(zhí)行的時候是必須等待鎖釋放的。這樣實際上就是將原本并行執(zhí)行的代碼,變?yōu)榇袌?zhí)行了。
sychronized能保護什么,起到什么作用
加鎖前的一些語句A
加鎖部分的一些語句B
加鎖后的一些語句C
創(chuàng)建一個線程安全的ArrayList
單線程下不建議使用Vector,因為Vector無腦給所有方法都加鎖了,單線程下會有很多加鎖和釋放鎖的操作來耗費時間。
public class ArrayList {private int size;private final long[]array = new long[100];public synchronized void add(long e){array[size++] = e;}public synchronized int size(){return size;}public synchronized long get(int index){if (index > 0 || index >= size){throw new ArrayIndexOutOfBoundsException();}return array[index];} } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的一定要会的synchronized关键字的用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux必知必会的基本命令和部署项目流
- 下一篇: 多线程的通知机制