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

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

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - java線程同步操作實例詳解

java線程同步操作實例詳解

2021-05-30 15:23shuair Java教程

這篇文章主要介紹了java線程同步操作,結(jié)合實例形式分析了Java線程同步與鎖機制相關(guān)原理、操作技巧與注意事項,需要的朋友可以參考下

本文實例講述了java線程同步操作。分享給大家供大家參考,具體如下:

java線程同步

?
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
public class hello {
  public static void main(string[] args) {
    myrun myrun0 = new myrun();
    new thread(myrun0, "thread0").start();
    new thread(myrun0, "thread1").start();
    new thread(myrun0, "thread2").start();
  }
}
class myrun implements runnable {
  private int k = 0;
  @override
  public void run() {
    for (int i = 0; i < 3; i++) {
      system.out.println(thread.currentthread().getname() + "**********" + i);
      k++;
      if (k <= 3) {
        if ("thread0".equals(thread.currentthread().getname())) {
          try {
            thread.sleep(100);
          } catch (interruptedexception e) {
            e.printstacktrace();
          }
        }
        system.out.println(thread.currentthread().getname() + "," + k);
      }
    }
  }
}

輸出結(jié)果

thread0**********0
thread1**********0
thread2**********0
thread1,2
thread2,3
thread1**********1
thread2**********1
thread2**********2
thread1**********2
thread0,7
thread0**********1
thread0**********2

說明多線程在某些場景是存在問題的,有時候需要線程同步。

同步 synchronized

同步代碼塊,synchronized(obj){},obj是一個對象,在這里就相當(dāng)于一把鎖,表示一旦有進程搶到了這把鎖的鑰匙(就是進入了代碼塊),其他進程將無法進入該鎖的代碼塊(當(dāng)前代碼塊其他進程一定是進不來了,其他地方的代碼塊如果也是用了這把鎖,同樣進不去),只有代碼塊執(zhí)行完,釋放鎖后,所有進程再重新?lián)岃€匙。

注意,上同一把鎖的代碼塊都會被鎖住,這些代碼塊可能寫在不同方法不同位置上。

被同步代碼塊包住的代碼多個線程只能順次進入。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
synchronized (this) {
  k++;
  if (k <= 3) {
    if ("thread0".equals(thread.currentthread().getname())) {
      try {
        thread.sleep(100);
      } catch (interruptedexception e) {
        e.printstacktrace();
      }
    }
    system.out.println(thread.currentthread().getname() + "," + k);
  }
}

this表示當(dāng)前對象,這里考慮的只是運行這個方法,不涉及其它類也不涉及這個類的其它地方需要同步問題,所以用this也是可以的。k增加和輸出一個流程內(nèi)只能有一個線程在訪問,所以可以得到想要的輸出結(jié)果

輸出結(jié)果

thread0**********0
thread1**********0
thread2**********0
thread0,1
thread0**********1
thread2,2
thread2**********1
thread1,3
thread1**********1
thread0**********2
thread2**********2
thread1**********2

對方法進行同步,如果存在多線程,每個線程順次訪問該方法

注意,如果一個類里面存在多個同步方法,那么這些同步方法的鎖是一個,都是當(dāng)前對象,所以不同線程想同時訪問同一對象的不同方法也是不行的,因為這些方法都上了同一把鎖,但是鑰匙只有一把,只能一個線程持有。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@override
public synchronized void run() {
  for (int i = 0; i < 3; i++) {
    system.out.println(thread.currentthread().getname() + "**********" + i);
    k++;
    if (k <= 3) {
      if ("thread0".equals(thread.currentthread().getname())) {
        try {
          thread.sleep(100);
        } catch (interruptedexception e) {
          e.printstacktrace();
        }
      }
      system.out.println(thread.currentthread().getname() + "," + k);
    }
  }
}

輸出結(jié)果

thread0**********0
thread0,1
thread0**********1
thread0,2
thread0**********2
thread0,3
thread2**********0
thread2**********1
thread2**********2
thread1**********0
thread1**********1
thread1**********2

死鎖

?
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class hello {
  public static void main(string[] args) {
    a a = new a();
    b b = new b();
    new thread(new myrun(a,b)).start();
    new thread(new myrun1(a,b)).start();
  }
}
class myrun implements runnable{
  private a a;
  private b b;
  public myrun(a a, b b) {
    this.a = a;
    this.b = b;
  }
  @override
  public void run(){
    a.say(b);
  }
}
class myrun1 implements runnable {
  private a a;
  private b b;
  public myrun1(a a, b b) {
    this.a = a;
    this.b = b;
  }
  @override
  public void run() {
    b.say(a);
  }
}
class a{
  public synchronized void say(b b){
    system.out.println("a要知道b的信息");
    b.info();
  }
  public synchronized void info(){
    system.out.println("這是a");
  }
}
class b{
  public synchronized void say(a a){
    system.out.println("b要知道a的信息");
    a.info();
  }
  public synchronized void info(){
    system.out.println("這是b");
  }
}

如果兩個線程同時進入了兩個say方法,就是出現(xiàn)死鎖。

關(guān)鍵點在于一個對象的多個同步方法具有相同的鎖,都是當(dāng)前對象。也就是x線程在訪問a對象的say方法過程中,y線程是無法訪問a對象的info方法的,因為開鎖的鑰匙已經(jīng)被x線程搶占了。

上面的程序,如果線程x,y同時進入了兩個say方法,a對象同步方法的鎖被線程x搶占,b對象同步方法的鎖被線程y搶占,此時線程x無法訪問b對象的同步方法,線程y無法訪問a對象的同步方法。代碼中恰好想要訪問,所以就出現(xiàn)死鎖了。

希望本文所述對大家java程序設(shè)計有所幫助。

原文鏈接:https://blog.csdn.net/shuair/article/details/81906040

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产精品一级毛片在线 | 色九九 | 国产精品成av人在线视午夜片 | 一级黄色影视 | 成人在线观看免费爱爱 | 亚洲亚色 | concern超碰在线 | 欧美亚洲高清 | 久久精品无码一区二区三区 | 91网在线观看 | 亚洲精品久久久久久一区二区 | 欧美日韩久久久久 | 亚洲精品久久久久久动漫 | 伊人狠狠 | 国产高清一区二区三区 | 亚洲美女久久 | 毛片a级毛片免费 | 国产综合久久 | 中文字幕66页| 亚洲最新无码中文字幕久久 | 欧美视频网站 | 成人在线一区二区三区 | 91精品久久久久久久91蜜桃 | 欧美激情小视频 | 国产有码| 中文字幕久久久 | 欧美一级在线视频 | 国产精品极品美女在线观看免费 | 国产高清一区二区三区 | www免费网站在线观看 | 亚洲国产成人一区二区精品区 | 国产欧美综合一区二区三区 | 91精品国产手机 | 日韩欧美国产一区二区 | 日韩在线观看一区 | 中文字幕亚洲一区二区va在线 | 黄在线| 成人精品网站在线观看 | 亚洲性人人天天夜夜摸 | 国产成人精品一区二区三区四区 | 国产黄色免费观看 |