av手机免费在线观看,国产女人在线视频,国产xxxx免费,捆绑调教一二三区,97影院最新理论片,色之久久综合,国产精品日韩欧美一区二区三区

java語言

Java線程同步的方法

時(shí)間:2025-06-01 22:03:11 java語言 我要投稿
  • 相關(guān)推薦

Java線程同步的方法

  線程的同步是Java多線程編程的難點(diǎn),往往開發(fā)者搞不清楚什么是競(jìng)爭(zhēng)資源、什么時(shí)候需要考慮同步,怎么同步等等問題,當(dāng)然,這些問題沒有很明確的答案,但有些原則問題需要考慮,是否有競(jìng)爭(zhēng)資源被同時(shí)改動(dòng)的問題?以下僅供參考!

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

  /**

  * 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;

  }

  /**

  * 業(yè)務(wù)方法

  * @param x 添加x萬元

  */

  public synchronized void oper(int x) {

  try {

  Thread.sleep(10L);

  this.cash += x;

  System.out.println(Thread.currentThread()。getName() + “運(yùn)行結(jié)束,增加” + x + “”,“當(dāng)前用戶賬戶余額為:” + cash);

  Thread.sleep(10L);

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  @Override

  public String toString() {

  return “User{” + “code=‘” + code + ’‘’ + “, cash=” + cash +‘}’;

  }

  }

  輸出結(jié)果:線程A運(yùn)行結(jié)束,增加“20”,當(dāng)前用戶賬戶余額為:120.

  線程F運(yùn)行結(jié)束,增加“21”,當(dāng)前用戶賬戶余額為:141.

  線程E運(yùn)行結(jié)束,增加“32”,當(dāng)前用戶賬戶余額為:173.

  線程C運(yùn)行結(jié)束,增加“-80”,當(dāng)前用戶賬戶余額為:93.

  線程B運(yùn)行結(jié)束,增加“-60”,當(dāng)前用戶賬戶余額為:33.

  線程D運(yùn)行結(jié)束,增加“-30”,當(dāng)前用戶賬戶余額為:3.

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

  線程D運(yùn)行結(jié)束,增加“-30”,當(dāng)前用戶賬戶余額為:63.

  線程B運(yùn)行結(jié)束,增加“-60”,當(dāng)前用戶賬戶余額為:3.

  線程F運(yùn)行結(jié)束,增加“21”,當(dāng)前用戶賬戶余額為:61.

  線程E運(yùn)行結(jié)束,增加“32”,當(dāng)前用戶賬戶余額為:93.

  線程C運(yùn)行結(jié)束,增加“-80”,當(dāng)前用戶賬戶余額為:61.

  Process finished with exit code 0很顯然,上面的結(jié)果是錯(cuò)誤的,導(dǎo)致錯(cuò)誤的原因是多個(gè)線程并發(fā)訪問了競(jìng)爭(zhēng)資源u,并對(duì)u的屬性做了改動(dòng)?梢娡降闹匾。注意:通過前文可知,線程退出同步方法時(shí)將釋放掉方法所屬對(duì)象的鎖,但還應(yīng)該注意的是,同步方法中還可以使用特定的方法對(duì)線程進(jìn)行調(diào)度。這些方法來自于java.lang.Object類,void notify()。

  喚醒在此對(duì)象監(jiān)視器上等待的單個(gè)線程。

  void notifyAll()

  喚醒在此對(duì)象監(jiān)視器上等待的所有線程。

  void wait()

  導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對(duì)象的 notify() 方法或 notifyAll() 方法。

  void wait(long timeout)

  導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對(duì)象的 notify() 方法或 notifyAll() 方法,或者超過指定的時(shí)間量。

  void wait(long timeout, int nanos)

  導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對(duì)象的 notify() 方法或 notifyAll() 方法,或者其他某個(gè)線程中斷當(dāng)前線程,或者已超過某個(gè)實(shí)際時(shí)間量。

【Java線程同步的方法】相關(guān)文章:

Java 如何進(jìn)行線程同步05-19

java多線程的同步和異步02-02

Java線程同步的優(yōu)先級(jí)介紹04-10

利用Java終止線程的方法04-05

Java實(shí)現(xiàn)多線程的方法04-15

Java多線程通信方法05-18

JAVA中終止線程的方法08-12

java單線程多線程的實(shí)現(xiàn)與方法04-26

java多線程同步塊實(shí)例講解素材03-03