国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - java多線程的同步方法實(shí)例代碼

java多線程的同步方法實(shí)例代碼

2020-09-19 18:24Java之家 JAVA教程

這篇文章主要介紹了 java多線程的同步方法實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下

 java多線程的同步方法實(shí)例代碼

先看一個(gè)段有關(guān)銀行存錢(qián)的代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Bank {
  private int sum;
  public void add(int num){
    sum = sum + num;
    try {
      Thread.sleep(10);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println("total num is : " + sum);
  }
}
class Custom implements Runnable{
  private Bank b = new Bank();
 
  @Override
  public void run() {
    for(int i = 3 ; i > 0 ; i--)
      b.add(100);
  }
}
public class BankDemo{
  public static void main(String[] args) {
    Custom custom = new Custom();
    Thread t1 = new Thread(custom);
    Thread t2 = new Thread(custom);
    t1.start();
    t2.start();
  }
}

此代碼的運(yùn)行結(jié)果為:

?
1
2
3
4
5
6
total num is : 100
total num is : 300
total num is : 400
total num is : 500
total num is : 500
total num is : 600

可以看出sum的值與預(yù)期的效果不太一樣;造成這種現(xiàn)象的原因有兩個(gè):

1.程序存在兩個(gè)以上的子線程;

2.子線程中存在多條語(yǔ)句操作同一變量;

上述例子中:創(chuàng)建了兩個(gè)子線程·t1 和 t2,分別向銀行中存錢(qián)。但是可以看出銀行的實(shí)力隨著Custom的創(chuàng)建,只創(chuàng)建了一個(gè)對(duì)象。也就是說(shuō)我們只操作一個(gè)數(shù)據(jù)變量即為銀行中錢(qián)的總數(shù)sum;當(dāng)兩個(gè)子線程開(kāi)啟的時(shí)候run方法中調(diào)用了bank的add方法,而add方法中有兩個(gè)語(yǔ)句都在操作sum一個(gè)sum的增加,一個(gè)是打印sum,當(dāng)兩個(gè)子線程搶占cpu執(zhí)行各自的程序的時(shí)候會(huì)出現(xiàn):

當(dāng)t1執(zhí)行到add以后,t2搶到了cpu的執(zhí)行權(quán),執(zhí)行也是執(zhí)行了add語(yǔ)句,隨后打印出sum的值,這時(shí)候由于sum增加了兩次,所以打印出來(lái)的sum值為200。類推,假如這個(gè)時(shí)候t1又搶回了cpu的執(zhí)行權(quán),因此又打印出一次200。

顯然這種現(xiàn)象是我們不希望產(chǎn)生的。我們希望一個(gè)線程存完錢(qián)然后打印出結(jié)果,之后才允許下一次添加操作。這就是多線程會(huì)產(chǎn)生的問(wèn)題,線程不安全。

我們應(yīng)盡量避免這種現(xiàn)象的發(fā)生,Java給我們提供了三種方法來(lái)解決這個(gè)問(wèn)題:

第一種:同步代碼塊

?
1
2
3
4
5
6
7
8
9
10
11
12
//private Object obj = new Object();
  public void add(int num) {
    synchronized (this) {
      sum = sum + num;
      try {
        Thread.sleep(10);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println("total num is : " + sum);
    }
  }

將多線程中需要操作同一數(shù)據(jù)對(duì)象的語(yǔ)句使用同步代碼塊包含。同步代碼塊的原理就是:

1.java中每個(gè)對(duì)象都有一個(gè)內(nèi)置鎖;

2.當(dāng)程序運(yùn)行到同步代碼塊的時(shí)候首先會(huì)獲取指定對(duì)象的鎖,這個(gè)鎖對(duì)于多個(gè)線程來(lái)說(shuō)是唯一的。我們可以創(chuàng)建任意一個(gè)對(duì)象(obj)讓他當(dāng)作同步代碼塊的鎖。

3.當(dāng)程序中只有一個(gè)只有一個(gè)鎖的話我們還可以使用this,this代表當(dāng)前執(zhí)行代碼所操作的實(shí)例對(duì)象的鎖。即擁有add方法的類的對(duì)象,即bank。

4.兩個(gè)并發(fā)線程訪問(wèn)同一個(gè)對(duì)象object中的這個(gè)synchronized(this)同步代碼塊時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行。另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊以后才能執(zhí)行該代碼塊。

這樣就可以操作同一個(gè)數(shù)據(jù)的多條語(yǔ)句只能在“同一段時(shí)間”只能被一個(gè)子線程所操作。

第二種 同步函數(shù)

?
1
2
3
4
5
6
7
8
9
public synchronized void add(int num) {
     sum = sum + num;
     try {
       Thread.sleep(10);
     } catch (InterruptedException e) {
       e.printStackTrace();
     }
     System.out.println("total num is : " + sum);
   }

除了同步代碼塊以外我們還可以將需要同步的操作抽象成一個(gè)函數(shù),然后將這個(gè)函數(shù)用synchronized修飾,形成同步方法。比如上述例子中的add方法中的語(yǔ)句都在操作sum對(duì)象。我們就可以將add方法使用synchronized修飾。這樣也能達(dá)到代碼同步的效果。

同步方法使用的鎖其實(shí)就是 this。

值得一提的是:同步方法和同步代碼塊,在開(kāi)發(fā)程序的時(shí)候我們更推薦使用同步代碼塊。

1.同步代碼塊可以綁定任意對(duì)象,而同步函數(shù)只能綁定該類對(duì)象this

2.如果多個(gè)線程使用同一個(gè)鎖的話,那么兩者均可以使用,如果存在多個(gè)鎖的(比如,在一個(gè)對(duì)象的同步方法里面調(diào)用另外一個(gè)對(duì)象的同步方法,則獲取了兩個(gè)對(duì)象的同步鎖),只能使用同步代碼塊。
靜態(tài)方法的同步
同步方法

?
1
public synchronized static void add(int num){}

同步代碼塊:

?
1
2
3
4
public synchronized void add(int num){
  synchronized (Bank.Class) {
  }
}

靜態(tài)方法的默認(rèn)同步鎖是當(dāng)前方法所在類的.class 對(duì)象,注意this與static不可以連用,所以不能使用this.Class

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本免费一区二区三区四区 | 欧美日韩国产三级 | 久久一级 | 偷拍自拍第一页 | 91精彩视频在线观看 | 成人aaaa免费全部观看 | 精品国产91乱码一区二区三区 | 川上优av中文字幕一区二区 | 日韩精品一区二区三区丰满 | 欧美黄色网视频 | 久久久久国产一区二区三区四区 | 久久久久久国产一级毛片高清版 | 久久伊人成人网 | 高清视频一区 | 国产一区二区三区视频 | 国外成人在线视频 | 国产精品美女久久久久久久久久久 | 亚洲 欧美 另类 综合 偷拍 | 成人国产电影 | 成人av在线播放 | 久久久久成人精品免费播放动漫 | 精品国产精品三级精品av网址 | 日韩免费av一区二区 | 日韩在线中文 | www.777色| 国产精品a久久 | 免费看黄在线网站 | 日韩精品一区二区三区中文在线 | 日韩一区二区三区在线观看 | 久久国产电影 | 久久久免费 | 粉嫩欧美一区二区三区高清影视 | 一区二区三区日本 | 成年人视频在线观看免费 | 久久久久久久久国产成人免费 | 久久一级| 精品视频久久 | 中文字幕,久热精品,视频在线 | 久久男人精品 | 中文字幕免费 | 亚洲精品乱码久久久久久蜜糖图片 |