多线程练习:
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();
}
}