synchronized关键字

synchronized是进行同步处理而保证线程安全。在一个方法中,如果是方法内的私有变量,那个这个变量是线程安全的,但是类中的实例变量是可能会出现线程安全问题的,当多个线程对这个实例变量进行修改,就可能会出现结果并不是我们期望的结果。

线程安全问题

下面一段代码就出现了线程安全问题。
本来当username为a的时候,num应该为100,但是由于设置让t1休眠了2秒,导致num被刷新成了200,导致最后输出时a和b的num都是200。

public class Service {    private int num = 0;    public void add(String username) {        try {            if (username.equals("a")) {
                num = 100;
                Thread.sleep(2000);
            } else {
                num = 200;
            }
            System.out.println(username + " " + num);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}public class ThreadA extends Thread {