Thread thread2 = new Thread()

  Thread thread2 = new Thread() {多線程

  @Overrideide

  public void run() {線程

  test.function();對象

  }get

  };同步

  thread1.start();博客

  thread2.start();io

  }function

  }class

  class TestCase {

  public synchronized void function() {// add synchronized keyword.

  for (int i = 0; i < 5; i++) {

  System.out.println(Thread.currentThread()。getName() + " executed result: " + i);

  }

  }

  }

  執行程序。獲得的輸出結果老是例如如下:

  Thread-0 executed result: 0

  Thread-0 executed result: 1

  Thread-0 executed result: 2

  Thread-0 executed result: 3

  Thread-0 executed result: 4

  Thread-1 executed result: 0

  Thread-1 executed result: 1

  Thread-1 executed result: 2

  Thread-1 executed result: 3

  Thread-1 executed result: 4

  從輸出結果可以看出,同步了方法以後,兩個線程順序輸出。說明線程Thread-1進入function方法後,線程Thread-2在方法外等待,等Thread-1運行完後釋放鎖,Thread-2才進入方法運行。

  但是咱們對上面的代碼稍做改動。看看同步方法。對於不一樣的對象狀況下是否都有線程同步的效果。

  [測試程序2.2]

  /**

  * Test case 2.2. synchronized method but different objects.

  */

  public class Test {

  public static void main(String[] args) {

  // There are two objects.

  final TestCase test1 = new TestCase();

  final TestCase test2 = new TestCase();

  Thread thread1 = new Thread() {

  @Override

  public void run() {

  test1.function();

  }

  };

  Thread thread2 = new Thread() {

  @Override

  public void run() {

  test2.function();

  }

  };

  thread1.start();

  thread2.start();

  }

  }

  class TestCase {

  public synchronized void function() {// add synchronized keyword.

  for (int i = 0; i < 5; i++) {

  System.out.println(Thread.currentThread()。getName() + " executed result: " + i);

  }

  }

  }

  執行程序,某次的執行結果例如如下:

  Thread-0 executed result: 0

  Thread-0 executed result: 1

  Thread-1 executed result: 0

  Thread-1 executed result: 1

  Thread-0 executed result: 2

  Thread-0 executed result: 3

  Thread-0 executed result: 4

  Thread-1 executed result: 2

  Thread-1 executed result: 3

  Thread-1 executed result: 4

  從以上結果可以看出,同步方法時,當一個線程進入一個對象的這個同步方法時。還有一個線程可以進入這個類的別的對象的同一個同步方法。

  同步方法小結

  在多線程中,同步方法時:

  同步方法,屬於對象鎖,僅僅是對一個對象上鎖;

  一個線程進入這個對象的同步方法,其它線程則進不去這個對象所有被同步的方法。可以進入這個對象未被同步的其它方法;

  一個線程進入這個對象的同步方法,其它線程可以進入同一個類的其它對象的所有方法(包含被同步的方法)。

  同步方法僅僅對單個對象實用。

  對靜態方法的同步

  上面是對普通的方法進行同步,發現僅僅能鎖對象。那麼此次咱們試着同步靜態方法看會有什麼結果。與上面的[測試程序2.2]來進行對照。

  [測試程序3.1]

  /**

  * Test case 3.1. synchronized static method.

  */

  public class Test {

  public static void main(String[] args) {

  // There are two objects.

  final TestCase test1 = new TestCase();

  final TestCase test2 = new TestCase();

  Thread thread1 = new Thread() {

  @Override

  public void run() {

  test1.function();

  }

  };

相關文章
相關標籤/搜索