1. 程式人生 > 其它 >java多執行緒同步安全問題小練習

java多執行緒同步安全問題小練習

技術標籤:Java

多執行緒練習:

package multithreading;

// 銀行有一個賬戶
// 有兩個賬戶分表向同一個賬戶存3000元,每次1000,存3次。每次存完列印賬戶餘額
public class MultiThreading {
    public static void main(String[] args) {
        Account account = new Account();
        Thread account1 = new Thread(account);
        Thread account2 = new Thread(account)
; account1.start(); account2.start(); } } class Account implements Runnable{ private int balance = 0; public void setBalance(){ balance += 1000; getBalance(); } public void getBalance(){ System.out.println("balance is: "+balance); }
public void run(){ while(balance<3000){ setBalance(); } } }

由於沒有增加同步,所以執行會出現執行緒安全問題,以下是每次存完錢顯示的餘額:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

同步方式一:synchronized()

package multithreading;

// 銀行有一個賬戶
// 有兩個賬戶分表向同一個賬戶存3000元,每次1000,存3次。每次存完列印賬戶餘額
public class MultiThreading {
    public static void main(String[] args)
{ Account account = new Account(); Thread account1 = new Thread(account); Thread account2 = new Thread(account); account1.start(); account2.start(); } } // 同步方式一: synchronized: class Account implements Runnable{ private int balance = 0; public void setBalance(){ balance += 1000; getBalance(); } public void getBalance(){ System.out.println("balance is: "+balance); } public synchronized void run(){ while(balance<3000){ setBalance(); } } }

在這裡插入圖片描述

同步方式二:Lock

package multithreading;

import java.util.concurrent.locks.ReentrantLock;

// 銀行有一個賬戶
// 有兩個賬戶分表向同一個賬戶存3000元,每次1000,存3次。每次存完列印賬戶餘額
public class MultiThreading {
    public static void main(String[] args) {
        Account account = new Account();
        Thread account1 = new Thread(account);
        Thread account2 = new Thread(account);
        account1.start();
        account2.start();


    }
}
// 同步方式二: Lock:
class Account implements Runnable{
    private int balance = 0;
    public void setBalance(){
        balance += 1000;
        getBalance();
    }
    public void getBalance(){
        System.out.println("balance is: "+balance);
    }
    static ReentrantLock lock = new ReentrantLock();
    public void run(){
        lock.lock();
        while(balance<3000){
            setBalance();
        }
        lock.unlock();
    }
}

在這裡插入圖片描述