亚洲一级电影在线观看,九九精品无码专区免费,亚洲AV无码资源在线观看 ,欧美国产高清

Java線程同步的方法

時間:2024-10-25 16:31:52 JAVA認證 我要投稿
  • 相關推薦

Java線程同步的方法

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

  對于同步,在具體的Java代碼中需要完成一下兩個操作:把競爭訪問的資源標識為private;同步哪些修改變量的代碼,使用synchronized關鍵字同步方法或代碼。當然這不是唯一控制并發安全的途徑。synchronized關鍵字使用說明synchronized只能標記非抽象的方法,不能標識成員變量。為了演示同步方法的使用,構建了一個信用卡賬戶,起初信用額為100w,然后模擬透支、存款等多個操作。顯然銀行賬戶User對象是個競爭資源,而多個并發操作的是賬戶方法oper(int x),當然應該在此方法上加上同步,并將賬戶的余額設為私有變量,禁止直接訪問。

  /**

  * 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 +‘}’;

  }

  }

  輸出結果:線程A運行結束,增加“20”,當前用戶賬戶余額為:120.

  線程F運行結束,增加“21”,當前用戶賬戶余額為:141.

  線程E運行結束,增加“32”,當前用戶賬戶余額為:173.

  線程C運行結束,增加“-80”,當前用戶賬戶余額為:93.

  線程B運行結束,增加“-60”,當前用戶賬戶余額為:33.

  線程D運行結束,增加“-30”,當前用戶賬戶余額為:3.

  Process finished with exit code 0反面教材,不同步的情況,也就是去掉oper(int x)方法的synchronized修飾符,然后運行程序,結果如下:線程A運行結束,增加“20”,當前用戶賬戶余額為:61.

  線程D運行結束,增加“-30”,當前用戶賬戶余額為:63.

  線程B運行結束,增加“-60”,當前用戶賬戶余額為:3.

  線程F運行結束,增加“21”,當前用戶賬戶余額為:61.

  線程E運行結束,增加“32”,當前用戶賬戶余額為:93.

  線程C運行結束,增加“-80”,當前用戶賬戶余額為:61.

  Process finished with exit code 0很顯然,上面的結果是錯誤的,導致錯誤的原因是多個線程并發訪問了競爭資源u,并對u的屬性做了改動。可見同步的重要性。注意:通過前文可知,線程退出同步方法時將釋放掉方法所屬對象的鎖,但還應該注意的是,同步方法中還可以使用特定的方法對線程進行調度。這些方法來自于java.lang.Object類,void notify()。

  喚醒在此對象監視器上等待的單個線程。

  void notifyAll()

  喚醒在此對象監視器上等待的所有線程。

  void wait()

  導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法。

  void wait(long timeout)

  導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量。

  void wait(long timeout, int nanos)

  導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者其他某個線程中斷當前線程,或者已超過某個實際時間量。

【Java線程同步的方法】相關文章:

Java多線程的實現方式03-20

2016年java多線程面試題及答案03-31

Java枚舉的常用方法03-16

JAVA認證開源技術:關于Java的對象equals方法03-04

Java中日期的處理方法03-09

sun認證考試經驗:多線程的幾種實現方法詳解01-22

Java數組操作方法大全03-04

Java獲取當前的系統時間的方法03-04

Java開發Tomcat部署項目方法03-04

主站蜘蛛池模板: 亚洲中文在线视频| 色婷婷亚洲一区二区综合| 欧美做爰一区二区三区| 综1合AV在线播放| 国产成人av无码精品天堂| 国产成人亚洲综合网站小说| 一本色道久久88亚洲综合| 无码精品人妻一区二区三区影院| 亚洲国产中文字幕在线视频综合 | 国产主播在线观看| 女厕偷窥一区二区三区| 精品无人乱码高清在线观看| 女人乱人伦国产在线观看| 久久午夜无码鲁丝片秋霞| 欧美日韩人成视频在线播放| 日韩精品毛片人妻AV不卡| 亚洲人成无码网站| 久久99国产精品尤物| 国产欧美日韩va另类在线播放| 日本无码欧美一区精品久久| 99久久无码一区人妻a片蜜| 殴美国产中文字幕视频在线观看| 久久中文字幕人妻熟av女| 璧山县| 亚洲国产成人久久一区二区三区| 成人亚洲欧美丁香在线观看| 在线性av| 尹人香蕉久久99天天拍| 亚洲日本韩国| 国产网友愉拍精品| 亚洲国产欧美在线观看| 四虎永久在线精品免费网址| 欧美人与动牲交a欧美精品| 好男人社区资源| 克东县| 欧美大屁股喷潮水xxxx| 99精品国产久热在线观看| 激情六月丁香婷婷| 人人草人人做人人爱| 延安市| 人妻无码aⅴ不卡中文字幕|