1. 程式人生 > 程式設計 >Java synchronize執行緒安全測試

Java synchronize執行緒安全測試

執行緒的執行是與當前CPU的資源排程與時間片是有關係的,當一個執行緒中的執行到某一部分方法的時候輪到另外一個執行緒來執行相應的程式碼,所以還沒有等到第一個執行緒執行完那麼CPU有切換到另外一個執行緒來執行其相應的程式碼,所以這個時候假如操作公共的資料部分就會出現錯誤

為了解決這個問題,可以使用 synchronized 同步程式碼塊來對公共部分進行同步操作

在用synchronize關鍵字修飾同步程式碼塊時,執行程式碼發現不能交替賣票。 以下是初始程式碼

package com.itheima.Test;

public class Test1a {

  public static void main(String[] args) {
    Ticket1a t1=new Ticket1a();
    new Thread(t1,"A").start();
    new Thread(t1,"B").start();
    new Thread(t1,"C").start();
    
  }

}
class Ticket1a implements Runnable{
   int ticket=100;
  @Override
  public void run() {
    synchronized (Ticket1a.class) {          
    while (true) {
      if (ticket<=0) {
        break;
      }
      try {
        Thread.sleep(20);
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
        System.out.println(Thread.currentThread().getName()+" sold  "+(ticket--));
    }
    }
  }
}

執行結果:

A sold  100
A sold  99
A sold  98
A sold  97
A sold  96
A sold  95
A sold  94
A sold  93
A sold  92
A sold  91
.
.
.
A sold  10
A sold  9
A sold  8
A sold  7
A sold  6
A sold  5
A sold  4
A sold  3
A sold  2
A sold  1

雖然解決了執行緒的安全問題,但是不能實現三個視窗交替賣票。後來仔細一看,是synchronize關鍵字修飾的程式碼塊位置不對,相當於修飾了同步方法。

更改後:

@Override
  public void run() {
    while (true) {
        synchronized (Ticket1a.class) {
      if (ticket<=0) {
        break;
      }
      try {
        Thread.sleep(20);
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
        System.out.println(Thread.currentThread().getName()+" sold  "+(ticket--));
      }
    }
  }

這樣就完成了執行緒安全的小測試。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。