1、修饰普通方法
public synchronized void method1(){ ......}public synchronized void method2(){ ......}public static void main(String[] args) { final Test test = new Test(); new Thread(new Runnable() { @Override public void run() { test.method1(); } }).start(); new Thread(new Runnable() { @Override public void run() { test.method2(); } }).start(); }//不同方法加锁,并且通过同一对象调用,所以调用之前要竞争同一对象上的锁,所以线程2需要等待线程1的method1执行完成才能开始执行method2方法。
2、修饰静态方法
public static synchronized void method1(){ ......}public static synchronized void method2(){ ...... } public static void main(String[] args) { final Test test1 = new Test(); final Test test2 = new Test(); new Thread(new Runnable() { @Override public void run() { test1.method1(); } }).start(); new Thread(new Runnable() { @Override public void run() { test2.method2(); } }).start(); }//method1和method2顺序执行,不能并发执行:即使test1和test2属于不同的对象,但是它们都属于同一个类的实例//(对静态方法的同步本质上是对类的同步,静态方法本质上是属于类的方法,而不是对象上的方法)
3、修饰代码块
public void method1(){ synchronized (this) { //执行内容 } } public void method2(){ synchronized (this) { //执行内容 } }//对于代码块的同步,判断后面括号中对象:括号内容都是this;同一对象2个线程调用:顺序执行,不同对象2个线程调用:并发执行//括号内容不同:并发执行