<em id="ftj5f"><span id="ftj5f"><th id="ftj5f"></th></span></em>

      <em id="ftj5f"><form id="ftj5f"></form></em>

        <form id="ftj5f"><form id="ftj5f"><th id="ftj5f"></th></form></form>

          XP系統下載樂園 - 系統之家,XP系統之家,GhostXP系統,純凈版XP系統,Windows7下載之家

          當前位置:首頁 > 系統教程 > 其它教程 > 詳細頁面

          Java如何實現線程同步?線程同步的方法和反面教材

          時間:2017-08-17 20:04:32來源:XP系統下載樂園作者:quers

            Java線程同步是保證多線程狀態下安全訪問競爭資源的一種編程手段,但線程的同步在Java多線程編程中算是一個比較難的難點,很多開發者甚至都不知道什么是競爭資源,也不知道時候需要進行線程同步,當然這是沒有明確答案的,一些原則問題還是要考慮。

          Java如何實現線程同步?線程同步的方法和反面教材

            Java如何實現線程同步?

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

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

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

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

            synchronized 關鍵字使用說明

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

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

          1. 01/**
          2. 02* Java線程:線程的同步
          3. 03*
          4. 04* @author leizhimin 2009-11-4 11:23:32
          5. 05*/
          6. 06public class Test {
          7. 07public static void main(String[] args) {
          8. 08User u = new User("張三", 100);
          9. 09MyThread t1 = new MyThread("線程A", u, 20);
          10. 10MyThread t2 = new MyThread("線程B", u, -60);
          11. 11MyThread t3 = new MyThread("線程C", u, -80);
          12. 12MyThread t4 = new MyThread("線程D", u, -30);
          13. 13MyThread t5 = new MyThread("線程E", u, 32);
          14. 14MyThread t6 = new MyThread("線程F", u, 21);
          15. 15t1.start();
          16. 16t2.start();
          17. 17t3.start();
          18. 18t4.start();
          19. 19t5.start();
          20. 20t6.start();
          21. 21}
          22. 22}
          23. 23class MyThread extends Thread {
          24. 24private User u;
          25. 25private int y = 0;
          26. 26MyThread(String name, User u, int y) {
          27. 27super(name);
          28. 28this.u = u;
          29. 29this.y = y;
          30. 30}
          31. 31public void run() {
          32. 32u.oper(y);
          33. 33}
          34. 34}
          35. 35class User {
          36. 36private String code;
          37. 37private int cash;
          38. 38User(String code, int cash) {
          39. 39this.code = code;
          40. 40this.cash = cash;
          41. 41}
          42. 42public String getCode() {
          43. 43return code;
          44. 44}
          45. 45public void setCode(String code) {
          46. 46this.code = code;
          47. 47}
          48. 48/**
          49. 49* 業務方法
          50. 50* @param x 添加x萬元
          51. 51*/
          52. 52public synchronized void oper(int x) {
          53. 53try {
          54. 54Thread.sleep(10L);
          55. 55this.cash += x;
          56. 56System.out.println(Thread.currentThread().getName() + "運行結束,增加“" + x + "”,當前用戶賬戶余額為:" + cash);
          57. 57Thread.sleep(10L);
          58. 58} catch (InterruptedException e) {
          59. 59e.printStackTrace();
          60. 60}
          61. 61}
          62. 62@Override
          63. 63public String toString() {
          64. 64return "User{" +
          65. 65"code='" + code + '\'' +
          66. 66", cash=" + cash +
          67. 67'}';
          68. 68}
          69. 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 + '}'; } }

          分享到:

          相關信息

          • 內網外網同時上網怎么設置?

            內網外網同時上網怎么設置?如果用戶的計算機擁有兩張網卡,設置內網外網同時上網很麻煩嗎?其實也還好,主要的問題就是配置路由表,將不同的網卡設置不同的路由表中就可以讓內網與外網同時使用而互不干擾。...

            2017-08-17

          • input 屬性有哪些?input標簽常用屬性介紹

            input 屬性有哪些?在Html頁面中input標簽的應用相信很多用戶都懂, 標簽用于搜集用戶信息,可以根據不同的 type 屬性值來確定輸入的字段是文本字段、復選框還是掩碼后的文本控件、單選按鈕、按鈕等等。...

            2017-08-17

          系統教程欄目

          欄目熱門教程

          人氣教程排行

          站長推薦

          熱門系統下載

          公眾號

          为什么做完之后下面流了东西白白的

          <em id="ftj5f"><span id="ftj5f"><th id="ftj5f"></th></span></em>

              <em id="ftj5f"><form id="ftj5f"></form></em>

                <form id="ftj5f"><form id="ftj5f"><th id="ftj5f"></th></form></form>