synchronized关键字最主要有以下3种应用方式
修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁;实例锁,一个实例一把锁
修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁;对象锁,一个对象一把锁
修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁;对象锁,一个对象一把锁
实例锁public class SuperHakceTest implements Runnable{ public static Integer flag = 0; public synchronized void instanse(){ flag ++; } @Override public void run() { for(int i = 0;i < 1000;i ++){ instanse(); } } public static void main(String[] args) throws Exception{ SuperHakceTest superHakceTest = new SuperHakceTest(); Thread thread1 = new Thread(superHakceTest); Thread thread2 = new Thread(superHakceTest); Thread thread3 = new Thread(superHakceTest); thread1.start();thread2.start();thread3.start(); thread1.join();thread2.join();thread3.join(); System.out.println("LAST FLAG = " + SuperHakceTest.flag); }}对象锁public class SuperHakceTest implements Runnable{ public static Integer flag = 0; public static synchronized void instanse(){ flag ++; } @Override public void run() { for(int i = 0;i < 1000;i ++){ instanse(); } } public static void main(String[] args) throws Exception{ SuperHakceTest superHakceTest1 = new SuperHakceTest(); SuperHakceTest superHakceTest2 = new SuperHakceTest(); SuperHakceTest superHakceTest3 = new SuperHakceTest(); Thread thread1 = new Thread(superHakceTest1); Thread thread2 = new Thread(superHakceTest2); Thread thread3 = new Thread(superHakceTest3); thread1.start();thread2.start();thread3.start(); thread1.join();thread2.join();thread3.join(); System.out.println("LAST FLAG = " + SuperHakceTest.flag); }}//this,当前实例对象锁synchronized(this){ for(int j=0;j<1000000;j++){ i++; }}//class对象锁synchronized(AccountingSync.class){ for(int j=0;j<1000000;j++){ i++; }}