1. 程式人生 > 實用技巧 >2020年9月12日 執行緒的安全問題:同步方法;

2020年9月12日 執行緒的安全問題:同步方法;

package com.atguigu.test11;

/*
 * 同步方法的語法格式:
 * 【修飾符】 synchronized 返回值型別  方法名(【形參列表】)throws 異常列表{
 * }
 * 
 * synchronized 【修飾符】  返回值型別  方法名(【形參列表】)throws 異常列表{
 * }
 * 
 * 同步方法的鎖物件,程式設計師無法選擇:
 * (1)非靜態方法:this
 * (2)靜態方法:當前類的Class物件
 */
public class Test11 {
    public static void main(String[] args) {
        Ticket t1 
= new Ticket("視窗一"); Ticket t2 = new Ticket("視窗二"); Ticket t3 = new Ticket("視窗三"); t1.start(); t2.start(); t3.start(); } } class Ticket extends Thread{ private static int total = 10; public Ticket(String name) { super(name); }
public void run(){ while(total>0){//程式停止的條件 saleOneTicket(); } } public synchronized static void saleOneTicket(){ if(total > 0){//執行緒安全問題的條件 System.out.println(Thread.currentThread().getName() + "賣出一張票"); total--; try
{ Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("剩餘:" + total); } } //同步方法,鎖的是方法的一次呼叫過程 //非靜態方法的鎖物件是this,這裡使用this,不是合格的鎖物件 /*public synchronized void saleOneTicket(){ if(total > 0){//執行緒安全問題的條件 System.out.println(getName() + "賣出一張票"); total--; try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("剩餘:" + total); } }*/ }