欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

同步鎖分類

對(duì)象鎖(this)

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

字符串鎖(比較特別)

應(yīng)用場景

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

需求:啟動(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同步鎖的正確使用方法(必看篇)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring RestTemplate具體使用詳解

    Spring RestTemplate具體使用詳解

    這篇文章主要介紹了Spring RestTemplate具體使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-04-04
  • JAVAsynchronized原理詳解

    JAVAsynchronized原理詳解

    這篇文章主要介紹了Java中synchronized實(shí)現(xiàn)原理詳解,涉及synchronized實(shí)現(xiàn)同步的基礎(chǔ),Java對(duì)象頭,Monitor,Mark Word,鎖優(yōu)化,自旋鎖等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Spring動(dòng)態(tài)配置計(jì)時(shí)器觸發(fā)時(shí)間的實(shí)例代碼

    Spring動(dòng)態(tài)配置計(jì)時(shí)器觸發(fā)時(shí)間的實(shí)例代碼

    這篇文章主要介紹了Spring動(dòng)態(tài)配置計(jì)時(shí)器觸發(fā)時(shí)間的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-06-06
  • Java中的ObjectOutputStream類使用

    Java中的ObjectOutputStream類使用

    ObjectOutputStream是Java.io包中的一個(gè)類,用于將Java對(duì)象的狀態(tài)信息序列化為字節(jié)流,序列化是將對(duì)象狀態(tài)轉(zhuǎn)換為字節(jié)流的過程,反序列化則是將字節(jié)流恢復(fù)為對(duì)象,本文介紹了ObjectOutputStream的原理、主要方法、使用步驟以及注意事項(xiàng)
    2024-09-09
  • Spring Cloud Feign報(bào)錯(cuò)問題解決

    Spring Cloud Feign報(bào)錯(cuò)問題解決

    這篇文章主要介紹了Spring Cloud Feign報(bào)錯(cuò)問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • SpringBoot的依賴管理配置

    SpringBoot的依賴管理配置

    一般來講SpringBoot項(xiàng)目是不需要指定版本,而SSM項(xiàng)目是需要指定版本,SpringBoot的核心依賴就是spring-boot-starter-parent和spring-boot-starter-web兩個(gè)依賴,關(guān)于這兩個(gè)依賴的相關(guān)介紹具體今天小編給大家介紹下
    2022-07-07
  • Spring為何要用三級(jí)緩存來解決循環(huán)依賴問題

    Spring為何要用三級(jí)緩存來解決循環(huán)依賴問題

    這篇文章主要給大家介紹了關(guān)于Spring為何要用三級(jí)緩存來解決循環(huán)依賴問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Spring?AOP手寫動(dòng)態(tài)代理代碼實(shí)例

    Spring?AOP手寫動(dòng)態(tài)代理代碼實(shí)例

    這篇文章主要介紹了Spring?AOP手寫動(dòng)態(tài)代理代碼實(shí)例,AOP我們知道,是在不修改源代碼的情況下,為代碼添加一些新功能的技術(shù),通過動(dòng)態(tài)代理,可以在不修改原始類代碼的前提下,對(duì)方法進(jìn)行攔截和增強(qiáng),需要的朋友可以參考下
    2024-01-01
  • J2SE 1.5版本的新特性一覽

    J2SE 1.5版本的新特性一覽

    J2SE 1.5版本的新特性一覽...
    2006-12-12
  • Java可變個(gè)數(shù)形參的方法實(shí)例代碼

    Java可變個(gè)數(shù)形參的方法實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Java可變個(gè)數(shù)形參的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-02-02

最新評(píng)論