日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

java之Synchronized(锁住对象和锁住代码)

發布時間:2023/12/4 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java之Synchronized(锁住对象和锁住代码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、問題

Synchronized我們一般都知道是鎖,但是我們怎么區分是鎖對象還是鎖代碼呢?

?


2、測試Demo

package leetcode.chenyu.test;public class Synchronized {class Test {public synchronized void testFirst() {print("testFirst");}public void testSecond() {synchronized(this) {print("testSecond");}}public void testThird() {synchronized(Test.class) {print("testThird");}}public void print(String method) {System.out.println(method + "start");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(method + "end");}}class TestThread extends Thread {public int mType = 0;public Test mTest = null;public TestThread(int type, Test test) {this.mType = type;this.mTest = test;}public void run() {if (mTest == null) {if (mType == 1) {Test test = new Test();test.testFirst();}else if (mType == 2) {Test test = new Test();test.testSecond(); } else if (mType == 3) {Test test = new Test();test.testThird(); }} else {if (mType == 1) {mTest.testFirst();}else if (mType == 2) {mTest.testSecond(); }else if (mType == 3) {mTest.testThird(); }}}}public static void main(String[] args) {Synchronized syn = new Synchronized();Test test = syn.new Test();for (int i = 0; i < 5; ++i) {syn.new TestThread(1, null).start();}} }

?


3、運行結果和分析

?

1)、按照上面的運行結果

testFirststart testFirststart testFirststart testFirststart testFirststart testFirstend testFirstend testFirstend testFirstend testFirstend

?

2)、把for循環里面的代碼換如下

?

syn.new TestThread(2, null).start();

運行結果如下

testSecondstart testSecondstart testSecondstart testSecondstart testSecondstart testSecondend testSecondend testSecondend testSecondend testSecondend

對于上面1)、2)、兩種情況,synchronized(this)以及非static的synchronized方法,只能防止多個線程同時執行同一個對象的同步代碼段,鎖的是對象,也就是鎖的本身this, 由于每個線程都新構建了一個新的對象,所以加了synchronized沒有鎖住。

?

3)、把for循環里面的代碼換如下

syn.new TestThread(1, test).start(); syn.new TestThread(2, test).start();

運行結果都一樣如下

testSecondstart testSecondend testSecondstart testSecondend testSecondstart testSecondend testSecondstart testSecondend testSecondstart testSecondend

這里由于我們幾個現場都共用一個對象,所以對象固定了,所以就鎖住了,其它線程在沒有釋放鎖的時候,進不來。

4)、把for循環里面的代碼換如下

syn.new TestThread(3, null).start(); syn.new TestThread(3, test).start();

結果都如下

testThirdstart testThirdend testThirdstart testThirdend testThirdstart testThirdend testThirdstart testThirdend testThirdstart testThirdend

synchronized(Test.class)實現了全局鎖的效果,不管對象是不是一樣的,都是同樣的效果,就鎖住代碼了

?

我么一般用這個比較多。

?

?

?

?

4、總結

1、synchronized加在非靜態方法前和synchronized(this)都是鎖住了這個類的對象,如果多線程訪問,對象不同,就鎖不住,對象固定是一個,就可鎖住。

2、synchronized(類名.class)和加在靜態方法前,是鎖住了代碼塊,不管多線程訪問的時候對象是不是同一個,能縮小代碼段的范圍就盡量縮小,能在代碼段上加同步就不要再整個方法上加同步,縮小鎖的粒度。

?

?

?

?

?

?

?


4、總結

總結

以上是生活随笔為你收集整理的java之Synchronized(锁住对象和锁住代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。