<delect id="sj01t"></delect>
  1. <em id="sj01t"><label id="sj01t"></label></em>
  2. <div id="sj01t"></div>
    1. <em id="sj01t"></em>

            <div id="sj01t"></div>

            Java多線程同步問題

            時間:2024-10-01 05:32:21 JAVA認證 我要投稿
            • 相關推薦

            Java多線程同步問題

              Java多線程的同步依靠的是對象鎖機制,synchronized關鍵字的背后就是利用了封鎖來實現對共享資源的互斥訪問。

              下面以一個簡單的實例來進行對比分析。實例要完成的工作非常簡單,就是創建10個線程,每個線程都打印從0到99這100個數字,我們希望線程之間不會出現交叉亂序打印,而是順序地打印。

              先來看第一段代碼,這里我們在run()方法中加入了synchronized關鍵字,希望能對run方法進行互斥訪問,但結果并不如我們希望那樣,這是因為這里synchronized鎖住的是this對象,即當前運行線程對象本身。代碼中創建了10個線程,而每個線程都持有this對象的對象鎖,這不能實現線程的同步。

              代碼

              package com.vista;

              class MyThread implements java.lang.Runnable {

              private int threadId;

              public MyThread(int id) {

              this.threadId = id;

              }

              @Override

              public synchronized void run() {

              for (int i = 0; i 《 100; ++i) {

              System.out.println(“Thread ID: ” + this.threadId + “ : ” + i);

              }

              }

              }

              public class ThreadDemo {

              /**

              * @param args

              * @throws InterruptedException

              */

              public static void main(String[] args) throws InterruptedException {

              for (int i = 0; i 《 10; ++i) {

              new Thread(new MyThread(i))。start();

              Thread.sleep(1);

              }

              }

              }

              從上述代碼段可以得知,要想實現線程的同步,則這些線程必須去競爭一個唯一的共享的對象鎖。

              基于這種思想,我們將第一段代碼修改如下所示,在創建啟動線程之前,先創建一個線程之間競爭使用的Object對象,然后將這個Object對象的引用傳遞給每一個線程對象的lock成員變量。這樣一來,每個線程的lock成員都指向同一個Object對象。我們在run方法中,對lock對象使用synchronzied塊進行局部封鎖,這樣就可以讓線程去競爭這個唯一的共享的對象鎖,從而實現同步。

              代碼

              package com.vista;

              class MyThread implements java.lang.Runnable {

              private int threadId;

              private Object lock;

              public MyThread(int id, Object obj) {

              this.threadId = id;

              this.lock = obj;

              }

              @Override

              public void run() {

              synchronized (lock) {

              for (int i = 0; i 《 100; ++i) {

              System.out.println(“Thread ID: ” + this.threadId + “ : ” + i);

              }

              }

              }

              }

              public class ThreadDemo {

              /**

              * @param args

              * @throws InterruptedException

              */

              public static void main(String[] args) throws InterruptedException {

              Object obj = new Object();

              for (int i = 0; i 《 10; ++i) {

              new Thread(new MyThread(i, obj))。start();

              Thread.sleep(1);

              }

              }

              }

            【Java多線程同步問題】相關文章:

            Java多線程的實現方式07-08

            java多線程面試題201710-03

            Java線程同步的方法10-25

            2016年java多線程面試題及答案07-02

            sun認證考試輔導:java關于多線程的部分操作07-27

            Java編程常見問題匯總10-05

            Java認證基礎知識:java字符串轉化整型問題07-21

            Java方法(函數)傳值和傳引用的問題10-07

            PHP Curl多線程原理詳解09-11

            Java與Java web的區別08-10

            <delect id="sj01t"></delect>
            1. <em id="sj01t"><label id="sj01t"></label></em>
            2. <div id="sj01t"></div>
              1. <em id="sj01t"></em>

                      <div id="sj01t"></div>
                      黄色视频在线观看