Java线程:线程的同步-同步方法
生活随笔
收集整理的這篇文章主要介紹了
Java线程:线程的同步-同步方法
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
線程的同步是保證多線程安全訪問(wèn)競(jìng)爭(zhēng)資源的一種手段。 線程的同步是Java多線程編程的難點(diǎn),往往開(kāi)發(fā)者搞不清楚什么是競(jìng)爭(zhēng)資源、什么時(shí)候需要考慮同步,怎么同步等等問(wèn)題,當(dāng)然,這些問(wèn)題沒(méi)有很明確的答案,但有些原則問(wèn)題需要考慮,是否有競(jìng)爭(zhēng)資源被同時(shí)改動(dòng)的問(wèn)題? 對(duì)于同步,在具體的Java代碼中需要完成一下兩個(gè)操作: 把競(jìng)爭(zhēng)訪問(wèn)的資源標(biāo)識(shí)為private; 同步哪些修改變量的代碼,使用synchronized關(guān)鍵字同步方法或代碼。 當(dāng)然這不是唯一控制并發(fā)安全的途徑。 synchronized關(guān)鍵字使用說(shuō)明 synchronized只能標(biāo)記非抽象的方法,不能標(biāo)識(shí)成員變量。 為了演示同步方法的使用,構(gòu)建了一個(gè)信用卡賬戶(hù),起初信用額為100w,然后模擬透支、存款等多個(gè)操作。顯然銀行賬戶(hù)User對(duì)象是個(gè)競(jìng)爭(zhēng)資源,而多個(gè)并發(fā)操作的是賬戶(hù)方法oper(int x),當(dāng)然應(yīng)該在此方法上加上同步,并將賬戶(hù)的余額設(shè)為私有變量,禁止直接訪問(wèn)。 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(); }
} public static 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); }
} public static 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萬(wàn)元 */ 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)前用戶(hù)賬戶(hù)余額為:" + cash); Thread.sleep(10L); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public String toString() { return "User{" + "code='" + code + '\'' + ", cash=" + cash + '}'; }
}
輸出結(jié)果:
?
如果去掉oper(int x)方法的synchronized修飾符,然后運(yùn)行程序,結(jié)果如下:
很顯然,上面的結(jié)果是錯(cuò)誤的,導(dǎo)致錯(cuò)誤的原因是多個(gè)線程并發(fā)訪問(wèn)了競(jìng)爭(zhēng)資源u,并對(duì)u的屬性做了改動(dòng)。 可見(jiàn)同步的重要性。轉(zhuǎn)載于:https://www.cnblogs.com/wanyong-wy/p/7718029.html
總結(jié)
以上是生活随笔為你收集整理的Java线程:线程的同步-同步方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: It's all about buffe
- 下一篇: Java基础-String和String