最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java同步鎖的正確使用方法(必看篇)

 更新時(shí)間:2017年08月24日 09:15:50   投稿:jingxian  
下面小編就為大家?guī)硪黄猨ava同步鎖的正確使用方法(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

同步鎖分類

對(duì)象鎖(this)

類鎖(類的字節(jié)碼文件對(duì)象即類名.class)

字符串鎖(比較特別)

應(yīng)用場(chǎng)景

在多線程下對(duì)共享資源的安全操作。

需求:?jiǎn)?dòng)5個(gè)線程對(duì)共享資源total進(jìn)行安全操作。

同步鎖在多線程單例模式下的使用

以上三類同步鎖都可以。

package cn.myThread;

public class MyThread implements Runnable {
 private static int total = 10;
 @Override
 public void run() {
  synchronized (this){ //使用this對(duì)象鎖
  //synchronized (MyThread.class){ //使用MyThread.class類鎖
  //synchronized (""){//使用字符串鎖
   System.out.println(Thread.currentThread().getName() + "正在運(yùn)行");
   try {
    Thread.sleep(100);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   total--;
   System.out.println(total);
   System.out.println(Thread.currentThread().getName() + "線程結(jié)束");
  }
 }
}
 
package cn.test;

import cn.myThread.MyThread;

public class TestMyThread {
 public static void main(String[] args){
  MyThread myThread = new MyThread();
  Thread thread = null;
  for (int i = 1 ; i <= 5 ; i++){
   thread = new Thread(myThread,"線程"+i); //開啟5個(gè)線程,傳入同一個(gè)對(duì)象
   thread.start();
  }
 }
}
 
線程1正在運(yùn)行

9

線程1線程結(jié)束

線程3正在運(yùn)行

8

線程3線程結(jié)束

線程5正在運(yùn)行

7

線程5線程結(jié)束

線程2正在運(yùn)行

6

線程2線程結(jié)束

線程4正在運(yùn)行

5

線程4線程結(jié)束

分析:從運(yùn)行結(jié)果可以看出5個(gè)線程串行執(zhí)行同步鎖里面的代碼,因?yàn)?個(gè)線程中的同步鎖對(duì)象this指向同一個(gè)的對(duì)象(同步鎖對(duì)象MyThread.class類鎖是同一個(gè)對(duì)象、同步鎖對(duì)象 ”” 字符串鎖是同一個(gè)對(duì)象),所以5個(gè)線程會(huì)串行執(zhí)行同步鎖里面的代碼。

同步鎖在多線程多例模式下的使用

錯(cuò)誤用法

package cn.myThread;

public class MyThread implements Runnable {
 private static int total = 10;
 @Override
 public void run() {
  synchronized (this){//使用this對(duì)象鎖
   System.out.println(Thread.currentThread().getName() + "正在運(yùn)行");
   try {
    Thread.sleep(100);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   total--;
   System.out.println(total);
   System.out.println(Thread.currentThread().getName() + "線程結(jié)束");
  }
 }
}
 
package cn.test;

import cn.myThread.MyThread;

public class TestMyThread {
 public static void main(String[] args){
  Thread thread = null;
  for (int i = 1 ; i <= 5 ; i++){
   thread = new Thread(new MyThread(),"線程"+i);//開啟5個(gè)線程,傳入5個(gè)不同對(duì)象
   thread.start();
  }
 }
}
 
線程2正在運(yùn)行

線程1正在運(yùn)行

線程3正在運(yùn)行

線程5正在運(yùn)行

線程4正在運(yùn)行

9

7

9

8

線程1線程結(jié)束

線程5線程結(jié)束

線程2線程結(jié)束

線程3線程結(jié)束

6

線程4線程結(jié)束

分析:從運(yùn)行結(jié)果可以看出5個(gè)線程并行執(zhí)行同步鎖里面的代碼,因?yàn)?個(gè)線程中的同步鎖對(duì)象this指向5個(gè)不同的對(duì)象,所以5個(gè)線程會(huì)同時(shí)執(zhí)行同步鎖里面的代碼。

正確用法

方式一:

package cn.myThread;

public class MyThread implements Runnable {
 private static int total = 10;
 @Override
 public void run() {
  synchronized (MyThread.class){//使用MyThread.class類鎖
   System.out.println(Thread.currentThread().getName() + "正在運(yùn)行");
   try {
    Thread.sleep(100);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   total--;
   System.out.println(total);
   System.out.println(Thread.currentThread().getName() + "線程結(jié)束");
  }
 }
}
 
package cn.test;

import cn.myThread.MyThread;

public class TestMyThread {
 public static void main(String[] args){
  Thread thread = null;
  for (int i = 1 ; i <= 5 ; i++){
   thread = new Thread(new MyThread(),"線程"+i); //開啟5個(gè)線程,傳入5個(gè)不同對(duì)象
   thread.start();
  }
 }
}
 
線程1正在運(yùn)行

9

線程1線程結(jié)束

線程5正在運(yùn)行

8

線程5線程結(jié)束

線程4正在運(yùn)行

7

線程4線程結(jié)束

線程3正在運(yùn)行

6

線程3線程結(jié)束

線程2正在運(yùn)行

5

線程2線程結(jié)束

分析:從運(yùn)行結(jié)果可以看出5個(gè)線程串行執(zhí)行同步鎖里面的代碼,因?yàn)?個(gè)線程中的同步鎖對(duì)象MyThread.class類鎖是同一個(gè)對(duì)象,所以5個(gè)線程會(huì)串行執(zhí)行同步鎖里面的代碼。

方式二:

package cn.myThread;

public class MyThread implements Runnable {
 private static int total = 10;
 @Override
 public void run() {
  synchronized (""){//使用字符串鎖
   System.out.println(Thread.currentThread().getName() + "正在運(yùn)行");
   try {
    Thread.sleep(100);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   total--;
   System.out.println(total);
   System.out.println(Thread.currentThread().getName() + "線程結(jié)束");
  }
 }
}
 
package cn.test;

import cn.myThread.MyThread;

public class TestMyThread {
 public static void main(String[] args){
  Thread thread = null;
  for (int i = 1 ; i <= 5 ; i++){
   thread = new Thread(new MyThread(),"線程"+i); //開啟5個(gè)線程,傳入5個(gè)不同對(duì)象
   thread.start();
  }
 }
}
 
線程1正在運(yùn)行

9

線程1線程結(jié)束

線程4正在運(yùn)行

8

線程4線程結(jié)束

線程5正在運(yùn)行

7

線程5線程結(jié)束

線程3正在運(yùn)行

6

線程3線程結(jié)束

線程2正在運(yùn)行

5

線程2線程結(jié)束

分析:從運(yùn)行結(jié)果可以看出5個(gè)線程串行執(zhí)行同步鎖里面的代碼,因?yàn)?個(gè)線程中的同步鎖對(duì)象 ”” 字符串鎖是同一個(gè)對(duì)象,所以5個(gè)線程會(huì)串行執(zhí)行同步鎖里面的代碼。

以上這篇java同步鎖的正確使用方法(必看篇)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • IDEA快速生成實(shí)體類的示例教程

    IDEA快速生成實(shí)體類的示例教程

    這篇文章主要介紹了IDEA快速生成實(shí)體類的示例教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • MyBatis Mapper代理使用方法詳解

    MyBatis Mapper代理使用方法詳解

    本文是小編日常收集整理的關(guān)于mybatis mapper代理使用方法知識(shí),通過本文還給大家提供有關(guān)開發(fā)規(guī)范方面的知識(shí)點(diǎn),本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧
    2016-08-08
  • 解決Maven靜態(tài)資源過濾問題

    解決Maven靜態(tài)資源過濾問題

    在我們使用Maven構(gòu)建項(xiàng)目的時(shí)候,會(huì)默認(rèn)過濾掉靜態(tài)資源,所以,需要手動(dòng)來配置,本文就介紹一下Maven靜態(tài)資源過濾的問題解決,感興趣的可以了解一下
    2021-06-06
  • SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源

    SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源

    在某些情況下,如果我們需要配置多個(gè)數(shù)據(jù)源,本文主要介紹了SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • MyBatis5中Spring集成MyBatis事物管理

    MyBatis5中Spring集成MyBatis事物管理

    這篇文章主要介紹了MyBatis5中MyBatis集成Spring事物管理的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • 詳解springboot+aop+Lua分布式限流的最佳實(shí)踐

    詳解springboot+aop+Lua分布式限流的最佳實(shí)踐

    這篇文章主要介紹了詳解springboot+aop+Lua分布式限流的最佳實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Intellij IDEA中一次性折疊所有Java代碼的快捷鍵設(shè)置

    Intellij IDEA中一次性折疊所有Java代碼的快捷鍵設(shè)置

    這篇文章主要介紹了Intellij IDEA中一次性折疊所有Java代碼的快捷鍵設(shè)置,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • spring boot使用properties定義短信模板的方法教程

    spring boot使用properties定義短信模板的方法教程

    這篇文章主要給大家介紹了關(guān)于spring boot使用properties定義短信模板的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • 走進(jìn)SpringBoot之配置文件與多環(huán)境詳解

    走進(jìn)SpringBoot之配置文件與多環(huán)境詳解

    這篇文章主要介紹了走進(jìn)SpringBoot之配置文件與多環(huán)境,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05
  • 解決java壓縮圖片透明背景變黑色的問題

    解決java壓縮圖片透明背景變黑色的問題

    這篇文章主要介紹了解決java壓縮圖片透明背景變黑色的問題,需要的朋友可以參考下
    2014-04-04

最新評(píng)論

清流县| 镇远县| 依兰县| 洪泽县| 平昌县| 台东市| 常宁市| 久治县| 南阳市| 彭水| 张家界市| 吉安市| 陆良县| 玛多县| 灵石县| 依兰县| 桐乡市| 南召县| 河源市| 仁怀市| 盈江县| 印江| 石嘴山市| 曲沃县| 怀安县| 葵青区| 孙吴县| 沭阳县| 临西县| 吴堡县| 两当县| 临潭县| 海南省| 宁国市| 湖州市| 阳曲县| 眉山市| 蒙城县| 泾源县| 同江市| 丹寨县|