java多執行緒同步安全問題小練習
阿新 • • 發佈:2021-01-21
技術標籤: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();
}
}