synchronized是用来解决多线程情况下的线程安全问题的,它可以修饰方法也可以修饰语句块 ,
方法内的变量是线程安全的 , 类的实例变量是非线程安全的
首先来看一个非线程安全的例子
public class HasSefPrivateNum { private int num; public void addNum(String userName) throws InterruptedException{ if("a".equals(userName)){ num=100; System.out.println("a set over"); Thread.sleep(2000); } else { num = 200; System.out.println("b set over"); } System.out.println("num="+num); } } public class ThreadA extends Thread { private HasSefPrivateNum numRef; public ThreadA(HasSefPrivateNum numRef) { this.numRef = numRef; } @Override public void run() { super.run(); try { numRef.addNum("a"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public class ThreadB extends Thread { private HasSefPrivateNum numRef; public ThreadB(HasSefPrivateNum numRef) { this.numRef = numRef; } @Override public void run() { super.run(); try { numRef.addNum("b"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public class Main { public static void main(String[] args) { HasSefPrivateNum numRef = new HasSefPrivateNum(); ThreadA t1 = new ThreadA(numRef); t1.start(); ThreadB t2 = new ThreadB(numRef); t2.start(); } }