synchronized
synchronized具有锁重入的功能,即一个线程需要调用对象的synchronized方法A,则获取该对象的锁,但是方法A中又调用了该对象synchronized方法B,此时对于A还没执行完锁还没释放,此时可以继续获取对象锁执行B方法,如果不支持重入则会造成死锁现象.
-
修饰普通方法
- 修饰普通方法时,拿到的是对象锁,比如,synchronized修饰方法A,若多个线程调用同一个对象的A方法时需要排队按顺序进行调用,如果是不同对象的A方法则可以异步调用.
- 若对象object中有两个synchronized方法A和B,当一个线程调用object.A()时另一个线程想要调用object.B()需要等A执行完毕之后,因为拿到的是对象锁,而对象包含AB两个方法
-
修饰静态方法,修饰类:修饰静态方法和修饰类都是拿到的类锁,将类模板锁定
- 修饰静态方法和普通方法的区别是一个拿的是类锁一个是对象锁,若对象object中有synchronized修饰的静态方法A和普通方法B,那个这两个方法虽然都有synchronized但是是异步执行的,因为一个是类锁一个是对象锁.
- 若一个对象中两个synchronized修饰的静态方法那么这两个静态方法需要排队执行,因为都使用类锁
-
修饰代码块:在某些情况下,我们编写的方法体可能比较大,同时存在一些比较耗时的操作,而需要同步的代码又只有一小部分,如果直接对整个方法进行同步操作,可能会得不偿失,此时我们可以使用同步代码块的方法对需要同步的代码进行包裹,这样就无需对整个方法进行同步操作了,也就是通常所说的减少锁的粒度。
- synchronized(this):为部分代码块加了对象锁,相当于给普通方法加synchronized的效果.
- synchronized(object):
- 若多个线程同时执行synchronized(object)则同步,若分别执行synchronized(object1)和synchronized(object2)则异步执行
- 多个线程分别执行synchronized(object)修饰的代码块和synchronized(object)修饰的方法,若为同一个对象则同步执行否则异步执行
- 多个线程分别执行synchronized(this)修饰的代码块和synchronized(object)修饰的方法,若为同一个对象则同步执行否则异步执行
- synchronized(*.class):拿到的是类锁,例如synchronized(A.class),多个线程操作A类同一对象时同步操作,多个线程操作A类的不同对象时也是同步操作,因为是类锁.