亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

同步鎖分類

對象鎖(this)

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

字符串鎖(比較特別)

應用場景

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

需求:啟動5個線程對共享資源total進行安全操作。

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

以上三類同步鎖都可以。

package cn.myThread;

public class MyThread implements Runnable {
 private static int total = 10;
 @Override
 public void run() {
  synchronized (this){ //使用this對象鎖
  //synchronized (MyThread.class){ //使用MyThread.class類鎖
  //synchronized (""){//使用字符串鎖
   System.out.println(Thread.currentThread().getName() + "正在運行");
   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個線程,傳入同一個對象
   thread.start();
  }
 }
}
 
線程1正在運行

9

線程1線程結(jié)束

線程3正在運行

8

線程3線程結(jié)束

線程5正在運行

7

線程5線程結(jié)束

線程2正在運行

6

線程2線程結(jié)束

線程4正在運行

5

線程4線程結(jié)束

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

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

錯誤用法

package cn.myThread;

public class MyThread implements Runnable {
 private static int total = 10;
 @Override
 public void run() {
  synchronized (this){//使用this對象鎖
   System.out.println(Thread.currentThread().getName() + "正在運行");
   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個線程,傳入5個不同對象
   thread.start();
  }
 }
}
 
線程2正在運行

線程1正在運行

線程3正在運行

線程5正在運行

線程4正在運行

9

7

9

8

線程1線程結(jié)束

線程5線程結(jié)束

線程2線程結(jié)束

線程3線程結(jié)束

6

線程4線程結(jié)束

分析:從運行結(jié)果可以看出5個線程并行執(zhí)行同步鎖里面的代碼,因為5個線程中的同步鎖對象this指向5個不同的對象,所以5個線程會同時執(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() + "正在運行");
   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個線程,傳入5個不同對象
   thread.start();
  }
 }
}
 
線程1正在運行

9

線程1線程結(jié)束

線程5正在運行

8

線程5線程結(jié)束

線程4正在運行

7

線程4線程結(jié)束

線程3正在運行

6

線程3線程結(jié)束

線程2正在運行

5

線程2線程結(jié)束

分析:從運行結(jié)果可以看出5個線程串行執(zhí)行同步鎖里面的代碼,因為5個線程中的同步鎖對象MyThread.class類鎖是同一個對象,所以5個線程會串行執(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() + "正在運行");
   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個線程,傳入5個不同對象
   thread.start();
  }
 }
}
 
線程1正在運行

9

線程1線程結(jié)束

線程4正在運行

8

線程4線程結(jié)束

線程5正在運行

7

線程5線程結(jié)束

線程3正在運行

6

線程3線程結(jié)束

線程2正在運行

5

線程2線程結(jié)束

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

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

相關文章

  • Spring RestTemplate具體使用詳解

    Spring RestTemplate具體使用詳解

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

    JAVAsynchronized原理詳解

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

    Spring動態(tài)配置計時器觸發(fā)時間的實例代碼

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

    Java中的ObjectOutputStream類使用

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

    Spring Cloud Feign報錯問題解決

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

    SpringBoot的依賴管理配置

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

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

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

    Spring?AOP手寫動態(tài)代理代碼實例

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

    J2SE 1.5版本的新特性一覽

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

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

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

最新評論