1.线程
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
private static Account account = new Account();
public static void main(String[] args) {
ExecutorService executor = Executors.newCachedThreadPool();
for(int i = 0; i < 100; i++){
executor.execute(new AddAPennyTask());
}
executor.shutdown();
while(!executor.isTerminated());
System.out.println("总金额" + account.getBalance());
}
public void run(){
account.deposit(1);
}
}
private static class Account{
private Lock lock = new ReentrantLock();
private int balance = 0;
public int getBalance(){
return balance;
}
public void deposit(int amount){
//临界区,balance是共享资源,由于getBalance和AddAPennyTask两个线程同时访问,所以打印出的结果会与期望值不同,因此需要线程同步
balance += amount;
}
}
}
2.线程同步,同步方法
private static class Account{
private int balance = 0;
public int getBalance(){
return balance;
}
//使用关键字synchronized实现线程的同步
//在执行一个线程时,其他线程会排队等候,该线程结束。
public synchronized void deposit(int amount){
balance += amount;
}
}
3.同步语句
public void deposit(int amount){
sysnchronized(this){
balance += amount;
}
}
4.加锁同步
private static class Account{
private int balance =0;
private Lock lock = new ReentrantLock();
public int getBalance(){
return balance;
}
public void deposite(int amount){
lock.lock();
balance += amount;
lock.unlock;