synchronized的使用場景可以歸結(jié)為3種:
① 修飾靜態(tài)方法敛瓷,給當(dāng)前類對(duì)象加鎖叁巨,進(jìn)入同步方法時(shí)需要獲得類對(duì)象的鎖
② 修飾實(shí)例方法,給當(dāng)前實(shí)例變量加鎖琐驴,進(jìn)入同步方法時(shí)需要獲得當(dāng)前實(shí)例的鎖
③ 修飾同步方法塊俘种,指定加鎖對(duì)象(可以是實(shí)例對(duì)象秤标,也可以是類變量),對(duì)給定對(duì)象加鎖宙刘,進(jìn)入同步方法塊時(shí)需要獲得加鎖對(duì)象的鎖
1苍姜、靜態(tài)方法
Class BankAccount{
private static int accountNum; // 一共有多少個(gè)銀行賬號(hào)
public static synchronized void setAccountNum(){
accountNum = accountNum + 1;
}
}
2、成員方法
public class BankAccount{
private double balance;
private static Logger logger = LoggerFactory.getLogger(BankAccount.class);
public synchronized void deposite(double moneyToAdd){
String threadName = Thread.currentThread().getName();
logger.info(threadName + "--當(dāng)前銀行余額為:" + this.balance);
balance = balance + moneyToAdd;
logger.info(threadName + "--存后銀行余額為:" + this.balance);
}
}
3悬包、同步代碼塊衙猪,塊對(duì)象是實(shí)例對(duì)象
public class BankAccount{
private double balance;
private static Logger logger = LoggerFactory.getLogger(BankAccount.class);
public void deposite(double moneyToAdd){
String threadName = Thread.currentThread().getName();
logger.info(threadName + "--當(dāng)前銀行余額為:" + this.balance);
synchronized(this){
balance = balance + moneyToAdd;
}
logger.info(threadName + "--存后銀行余額為:" + this.balance);
}
}
4、同步代碼塊布近,塊對(duì)象是類對(duì)象
Class BankAccount{
private static int accountNum; // 一共有多少個(gè)銀行賬號(hào)
public synchronized void setAccountNum(){
synchronized(BankAccount.class){
accountNum = accountNum + 1;
}
}
}