如果要使这个类的所有对象都共享一个方法的锁,那么需要将方法设置为static,再加上synchronized锁,这把锁属于类了,所有这个类的对象都共享这把锁。
继续之前的账户类,我们修改下代码
账户类:
package com.ck.thread;
import java.math.BigDecimal;
public class Account {
public static synchronized void add(BigDecimal amount , String name) {
System.out.println(name + ", 开始充值,充值前余额: " + amount);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + ", 结束充值,充值后余额: " + amount);
}
}
同样充值的类也修改下:
package com.ck.thread;
import java.math.BigDecimal;
public class CzThread extends Thread{
private Account account;
private String accountName;
public CzThread(Account account) {
this.account = account;
}
@Override
public void run() {
account.add(new BigDecimal("100"), accountName);
}
public Account getAccount() {
return account;
}
public void setAccount(Account account) {
this.account = account;
}
public String getAccountName() {
return accountName;
}
public void setAccountName(String accountName) {
this.accountName = accountName;
}
}
然后主线程来测试:
package com.ck.thread;
public class MainThread {
public static void main(String[] args) throws InterruptedException {
/**
* 分别建两个账户,张三和李四
*
*/
Account account1 = new Account();
Account account2 = new Account();
CzThread t1 = new CzThread(account1);
t1.setAccountName("张三");
t1.start();
CzThread t2 = new CzThread(account2);
t2.setAccountName("李四");
t2.start();
}
}
运行结果:
张三, 开始充值,充值前余额: 100
张三, 结束充值,充值后余额: 100
李四, 开始充值,充值前余额: 100
李四, 结束充值,充值后余额: 100
我们看到李四是等待张三充值完了才能进去充值,其实这种充值方法在现实中如果是这样的话系统早就被投诉了,我们只是测试演示下,为了让大家更好的理解类级别的锁,就是在所要同步的方法加上static关键字,那么这个锁就属于这个类了,也就是作用于这个类的所有对象。