一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - Java教程 - Java線程同步、同步方法實例詳解

Java線程同步、同步方法實例詳解

2020-09-13 15:24在奮斗的大道 Java教程

本篇文章主要通過實例介紹了Java線程:線程的同步-同步方法,需要的朋友可以參考下

線程的同步是保證多線程安全訪問競爭資源的一種手段。

線程的同步是Java多線程編程的難點,往往開發者搞不清楚什么是競爭資源、什么時候需要考慮同步,怎么同步等等問題,當然,這些問題沒有很明確的答案,但有些原則問題需要考慮,是否有競爭資源被同時改動的問題?

對于同步,在具體的Java代碼中需要完成一下兩個操作:

把競爭訪問的資源標識為private;

同步哪些修改變量的代碼,使用synchronized關鍵字同步方法或代碼。

當然這不是唯一控制并發安全的途徑。

 synchronized關鍵字使用說明

synchronized只能標記非抽象的方法,不能標識成員變量。 

為了演示同步方法的使用,構建了一個信用卡賬戶,起初信用額為100w,然后模擬透支、存款等多個操作。顯然銀行賬戶User對象是個競爭資源,而多個并發操作的是賬戶方法oper(int x),當然應該在此方法上加上同步,并將賬戶的余額設為私有變量,

禁止直接訪問。

?
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/**
* Java線程:線程的同步
*
* @author leizhimin 2009-11-4 11:23:32
*/
public class Test {
  public static void main(String[] args) {
    User u = new User("張三", 100);
    MyThread t1 = new MyThread("線程A", u, 20);
    MyThread t2 = new MyThread("線程B", u, -60);
    MyThread t3 = new MyThread("線程C", u, -80);
    MyThread t4 = new MyThread("線程D", u, -30);
    MyThread t5 = new MyThread("線程E", u, 32);
    MyThread t6 = new MyThread("線程F", u, 21);
    t1.start();
    t2.start();
    t3.start();
    t4.start();
    t5.start();
    t6.start();
  }
}
class MyThread extends Thread {
  private User u;
  private int y = 0;
   MyThread(String name, User u, int y) {
    super(name);
    this.u = u;
    this.y = y;
  }
  public void run() {
    u.oper(y);
  }
}
class User {
  private String code;
  private int cash;
  User(String code, int cash) {
    this.code = code;
    this.cash = cash;
  }
  public String getCode() {
    return code;
  }
  public void setCode(String code) {
    this.code = code;
  }
  /**
   * 業務方法
   * @param x 添加x萬元
   */
  public synchronized void oper(int x) {
    try {
      Thread.sleep(10L);
      this.cash += x;
      System.out.println(Thread.currentThread().getName() + "運行結束,增加“" + x + "”,當前用戶賬戶余額為:" + cash);
      Thread.sleep(10L);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
  @Override
  public String toString() {
    return "User{" +
        "code='" + code + '\'' +
        ", cash=" + cash +
        '}';
  }
}

輸出結果:

?
1
2
3
4
5
6
線程A運行結束,增加“20”,當前用戶賬戶余額為:120
線程F運行結束,增加“21”,當前用戶賬戶余額為:141
線程E運行結束,增加“32”,當前用戶賬戶余額為:173
線程C運行結束,增加“-80”,當前用戶賬戶余額為:93
線程B運行結束,增加“-60”,當前用戶賬戶余額為:33
線程D運行結束,增加“-30”,當前用戶賬戶余額為:3

反面教材,不同步的情況,也就是去掉oper(int x)方法的synchronized修飾符,然后運行程序,結果如下:

?
1
2
3
4
5
6
線程A運行結束,增加“20”,當前用戶賬戶余額為:61
線程D運行結束,增加“-30”,當前用戶賬戶余額為:63
線程B運行結束,增加“-60”,當前用戶賬戶余額為:3
線程F運行結束,增加“21”,當前用戶賬戶余額為:61
線程E運行結束,增加“32”,當前用戶賬戶余額為:93
線程C運行結束,增加“-80”,當前用戶賬戶余額為:61

很顯然,上面的結果是錯誤的,導致錯誤的原因是多個線程并發訪問了競爭資源u,并對u的屬性做了改動。

可見同步的重要性。 

注意:

通過前文可知,線程退出同步方法時將釋放掉方法所屬對象的鎖,但還應該注意的是,同步方法中還可以使用特定的方法對線程進行調度。這些方法來自于java.lang.Object類。

?
1
2
3
4
5
6
7
8
9
10
void notify() 
     喚醒在此對象監視器上等待的單個線程。 
void notifyAll() 
     喚醒在此對象監視器上等待的所有線程。 
void wait() 
     導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法。 
void wait(long timeout) 
     導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量。 
void wait(long timeout, int nanos) 
     導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者其他某個線程中斷當前線程,或者已超過某個實際時間量

結合以上方法,處理多線程同步與互斥問題非常重要,著名的生產者-消費者例子就是一個經典的例子,任何語言多線程必學的例子。 

希望本篇文章對小伙伴們有所幫助

原文鏈接:http://blog.csdn.net/zhouzhiwengang/article/details/70227841

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 青草视频在线观看免费视频 | 国产精品青青在线观看香蕉 | 亚洲精品视频网 | 1024国产精品视频观看 | 国产3344视频在线观看免费 | 久久精品一卡二卡三卡四卡视频版 | 无码任你躁久久久久久久 | 99久久精品免费精品国产 | 青草久久精品亚洲综合专区 | 免费观看成年人视频 | 波多野结衣无码 | 楚乔传第二部免费观看全集完整版 | 亚洲精品综合 | 国产一区在线 | 欧美日韩视频一区三区二区 | brazzers欧美教师 | 校花在公车上被内射好舒 | 国产免费成人在线视频 | 国产无限 | 草草草在线 | 成人国产第一区在线观看 | 2019aw网站 | 欧美一级免费看 | 色综合伊人色综合网站中国 | 特级淫片大乳女子高清视频 | 亚洲高清无在码在线电影 | 四虎在线免费 | 亚洲乱亚洲乱妇41p国产成人 | 免费稚嫩福利 | 欧美乱理伦另类视频 | 国产成人激情 | 美女厕所尿尿擦逼 | 免费日本视频 | 亚洲 欧美 清纯 校园 另类 | 99国产国人青青视频在线观看 | 亚洲精品一线二线三线 | 亚洲视频在线观看不卡 | 亚洲品质自拍网站 | 免费在线观看小视频 | 777午夜精品免费播放 | 午夜办公室在线观看高清电影 |