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++;
- }
- }
来源: http://www.bubuko.com/infodetail-2552745.html