synchronized关键字作用在同步代码块上,给共享变量“上锁”可以解决线程安全问题。这把“锁”可以作用在某个对象上,也可以作用在某个类上。
举个栗子,有个自助银行,里面有两台ATM机,工作人员可以看到每次存取款之后机器里钞票的总金额数。现在有两个人来存钱,各存50元。
没有锁
在下面的代码中,两个线程t1、t2相当于两个人,每个Service对象相当于一台ATM机。这里先只创建了一个Service对象,也就是两个人向同一台ATM机里存钱。显然,第一个人存完后机器里应当有150元,第二个人存完后有200元。
public class Bank {
public static void main(String[] args) {
Service s1 = new Service();
//Service s2 = new Service();
Thread t1 = new Thread(s1, "t1");
Thread t2 = new Thread(s1, "t2");
t1.start();
t2.start();
}
}
class Service implements Runnable{
private int total = 100;
@Override
public void run() {
total += 50;
System.out.println(Thread.currentThread().getName() + " --- total = " + total);
}
}
输出ÿ