一、Java中的synchronized关键字

193 阅读1分钟

理解:Java中的synchronized关键字.

指标:理解synchronized的含义、明确synchronized关键字修饰普通方法、 静态方法和代码块时锁对象的差异.

有如下一个类A

    class A{
        public synchronized  void a(){}
        public synchronized  void b(){}
    }

两个对象

A a1 = new A();

A a2 = new A();

Thread1     Thread2

a1.a();      a2.a();

问题一: 请问二者能否构成线程同步?

问题二: 如果A的定义是这样的呢?

    class A{
        public static synchronized  void a(){}
        public static synchronized  void b(){}
    }

synchronized 修饰对象为以下3种:

  1. 修饰普通方法 , 一个对象中加锁的方法只允许是一个线程访问的.这种情况锁的是访问该方法的实例对象,如果是多个线程不同的对象访问该方法,则无法保证同步.
  2. 修饰静态方法 , 静态方法是类方法,所以这种情况下锁的是包含这个方法的类,也就是类对象,这种情况下,多个线程的不同对象也是可以保证同步的
  3. 修饰代码块 , 如果是synchronized (obj),这个同步效果等同于修饰普通方法, 如果是synchronized (obj.class)同步效果等同于修饰静态方法.

问题1:不能同步

问题2:能同步