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

java 線程之對(duì)象的同步和異步(實(shí)例講解)

 更新時(shí)間:2017年07月20日 08:19:58   投稿:jingxian  
下面小編就為大家?guī)硪黄猨ava 線程之對(duì)象的同步和異步(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

一、多線程環(huán)境下的同步與異步

同步:A線程要請求某個(gè)資源,但是此資源正在被B線程使用中,因?yàn)橥綑C(jī)制存在,A線程請求不到,怎么辦,A線程只能等待下去。

package com.jalja.org.thread.demo01;

public class Thread02 {
 public synchronized void method1(){
  System.out.println("method1:"+Thread.currentThread().getName());
  try {
   Thread.sleep(3000);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
 public synchronized void method2(){
  System.out.println("method2:"+Thread.currentThread().getName());
 }
 public static void main(String[] args) {
  final Thread02 th=new Thread02();
  Thread thread1=new Thread(new Runnable() {
   public void run() {
    th.method1();
   }
  },"th1");
  
  Thread thread2=new Thread(new Runnable() {
   public void run() {
    th.method2();
   }
  },"th2");
  
  thread1.start();
  thread2.start();
 }
}

觀察輸出結(jié)果:method1:th1 在3秒后 method2:th2 輸出,這是因?yàn)閙ethod2() 與 method1()都是同步方法,而線程thread1 與 thread2操作的是同一個(gè)對(duì)象th,所以thread2在執(zhí)行method2()方法時(shí),需要先獲得到th對(duì)象的鎖。

異步:A線程要請求某個(gè)資源,但是此資源正在被B線程使用中,因?yàn)闆]有同步機(jī)制存在,A線程仍然請求的到,A線程無需等待。

package com.jalja.org.thread.demo01;

public class Thread02 {
 public synchronized void method1(){
  System.out.println("method1:"+Thread.currentThread().getName());
  try {
   Thread.sleep(3000);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
 public void method2(){
  System.out.println("method2:"+Thread.currentThread().getName());
 }
 public static void main(String[] args) {
  final Thread02 th=new Thread02();
  Thread thread1=new Thread(new Runnable() {
   public void run() {
    th.method1();
   }
  },"th1");
  
  Thread thread2=new Thread(new Runnable() {
   public void run() {
    th.method2();
   }
  },"th2");
  
  thread1.start();
  thread2.start();
 }
}

觀察輸出結(jié)果:method1:th1 與 method2:th2 同時(shí)輸出,這是因?yàn)閙ethod2 沒有加同步控制,所以線程thread2在執(zhí)行method2()方法時(shí)不用去獲得執(zhí)行權(quán)限(對(duì)象鎖)。

二、數(shù)據(jù)的臟讀

我們在設(shè)計(jì)業(yè)務(wù)的時(shí)候一定要考慮業(yè)務(wù)的整體性,不然就會(huì)出現(xiàn)數(shù)據(jù)一致性問題。

package com.jalja.org.thread.demo01;

public class Thread03 {
 private String name="zs";
 private String passWorrd="123";
 public synchronized void setValue(String name,String passWord){
  this.name=name;
  try {
   Thread.sleep(2000);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  this.passWorrd=passWord;
  System.out.println("set:name="+this.name +" passWorrd="+this.passWorrd);
 }
 public void getValue(){
  System.out.println("get:name="+this.name +" passWorrd="+this.passWorrd);
 }
 public static void main(String[] args) throws InterruptedException {
  final Thread03 th=new Thread03();
  Thread thread=new Thread(new Runnable() {
   public void run() {
    th.setValue("LS", "456");
   }
  });
  thread.start();
  Thread.sleep(100);
  th.getValue();
 }
}

結(jié)果:get:name=LS  passWorrd=123     set:name=LS  passWorrd=456    由結(jié)果可知get的數(shù)據(jù)顯然有問題,這是因?yàn)閠hread線程在set的時(shí)候,main線程在執(zhí)行g(shù)et方法。想要避免這種情況,我們就要保證當(dāng)有線程在操作同一個(gè)對(duì)象的數(shù)據(jù)時(shí),就不然其他線程也同時(shí)操作該對(duì)象的數(shù)據(jù)。這個(gè)情況我們在get方法上加 synchronized 關(guān)鍵字即可。

以上這篇java 線程之對(duì)象的同步和異步(實(shí)例講解)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

抚州市| 永寿县| 山东省| 时尚| 德格县| 错那县| 韩城市| 刚察县| 习水县| 鹿邑县| 铜陵市| 比如县| 徐闻县| 冀州市| 巴楚县| 峨眉山市| 渝北区| 马龙县| 黑河市| 三江| 广汉市| 家居| 秦安县| 泸水县| 宁都县| 屏边| 额敏县| 安义县| 合作市| 宜昌市| 六枝特区| 河间市| 芒康县| 闻喜县| 汉中市| 延津县| 华阴市| 侯马市| 阜南县| 望谟县| 德令哈市|