synchronized關鍵字的四種加鎖方式

2021-10-04 07:56:43 字數 4351 閱讀 9032

本篇我們來講解synchronized關鍵字的四種加鎖使用方式,並對其進行比較github專案位址。

public class synchronizedtest 

@override

public void run()

}static class thread2 extends thread

@override

public void run()

}static class utils catch (interruptedexception e)

system.out.println("method1 exec after-- threadname:" + thread.currentthread().getname());

}synchronized void method2() catch (interruptedexception e)

system.out.println("method2 exec after-- threadname:" + thread.currentthread().getname());}}

public static void main(string args)

}//執行結果

method1 exec before -- threadname:thread-0

method2 exec before -- threadname:thread-1

method1 exec after-- threadname:thread-0

method2 exec after-- threadname:thread-1

public static void main(string args) 

//執行結果

method1 exec before -- threadname:thread-0

method1 exec after-- threadname:thread-0

method2 exec before -- threadname:thread-1

method2 exec after-- threadname:thread-1

public class synchronizedtest2 

@override

public void run()

}static class thread2 extends thread

@override

public void run()

}static class utils catch (interruptedexception e)

system.out.println("method1 exec after-- threadname:" + thread.currentthread().getname());}}

void method2() catch (interruptedexception e)

system.out.println("method2 exec after-- threadname:" + thread.currentthread().getname());}}

}public static void main(string args)

}//執行結果

method1 exec before -- threadname:thread-0

method1 exec after-- threadname:thread-0

method2 exec before -- threadname:thread-1

method2 exec after-- threadname:thread-1

public static void main(string args) 

//執行結果

method1 exec before -- threadname:thread-0

method2 exec before -- threadname:thread-1

method1 exec after-- threadname:thread-0

method2 exec after-- threadname:thread-1

public class synchronizedtest3 

@override

public void run()

}static class thread2 extends thread

@override

public void run()

}static class utils catch (interruptedexception e)

system.out.println("method1 exec after-- threadname:" + thread.currentthread().getname());}}

void method2() catch (interruptedexception e)

system.out.println("method2 exec after-- threadname:" + thread.currentthread().getname());}}

}public static void main(string args)

}//執行結果

method1 exec before -- threadname:thread-0

method1 exec after-- threadname:thread-0

method2 exec before -- threadname:thread-1

method2 exec after-- threadname:thread-1

public static void main(string args) 

//執行結果

method1 exec before -- threadname:thread-0

method1 exec after-- threadname:thread-0

method2 exec before -- threadname:thread-1

method2 exec after-- threadname:thread-1

因為靜態方法可以直接用類名呼叫,所以就沒有例項化物件,從測試來看也是同步的效果。

public class synchronizedtest4 

}static class thread2 extends thread

}static class utils catch (interruptedexception e)

system.out.println("method1 exec after-- threadname:" + thread.currentthread().getname());

}synchronized static void method2() catch (interruptedexception e)

system.out.println("method2 exec after-- threadname:" + thread.currentthread().getname());}}

//synchronized(***.class)加鎖, 不管執行緒中傳入的是不是同乙個物件,都是同步

public static void main(string args)

}//執行結果

method1 exec before -- threadname:thread-0

method1 exec after-- threadname:thread-0

method2 exec before -- threadname:thread-1

method2 exec after-- threadname:thread-1

下面是對上述結果的總結,從**中能看出第三種和第四種方式其實是屬於同一類的,他們持有的是類鎖,而第乙個和第二個持有的是物件鎖,所以前兩個和後兩個不會發生互斥現象。

synchronized加鎖方式

同步還是非同步

synchronized void methodname()

執行緒中傳入的是同乙個物件同步,否則非同步

synchronized(this)

執行緒中傳入的是同乙個物件同步,否則非同步

synchronized(***.class)

不管執行緒中傳入的是不是同乙個物件,都是同步

synchronized static void methodname()

同步

synchronized關鍵字解析

一 修飾方法 1.修飾普通方法 對呼叫此方法的物件加鎖 2.修飾static方法 對呼叫此方法的類的所有物件加鎖 3.不能修飾構造方法,但是可以在構造方法內部修飾 塊 二 修飾 塊 1.synchronized this 相當於修飾普通方法 2.synchronized a.class 相當於修飾s...

解讀synchronized關鍵字

size large 最近在寫多執行緒程式,網上收集總結了synchronized的用法,結果如下 size 1 synchronized關鍵字的作用域有二種 1 是某個物件例項內,synchronized amethod 可以防止多個執行緒同時訪問這個物件的synchronized方法 如果乙個物...

synchronized 關鍵字分析

synchronized是典型的可衝入鎖,jdk1.5之後做了較大的優化 如圖,synchronized可以用在方法上也可以使用在 塊中,其中方法是例項方法和靜態方法分別鎖的是該類的例項物件和該類的物件。而使用在 塊中也可以分為三種,具體的可以看上面的 這裡的需要注意的是 如果鎖的是類物件的話,儘管...