概念:
类锁:所有对象共用一个锁
对象锁:一个对象一把锁,多个对象多把锁。
一、synchronized修饰普通方法(对象锁)
要知道,synchronized关键字修饰普通方法时,获得的锁是对象锁,也就是this。
如果创建个新对象,则不能保持同步!!
当该类中有多个普通方法被Synchronized修饰(同步),那么这些方法的锁都是这个类的一个对象this。多个线程访问这些方法时,如果这些线程调用方法时使用的是同一个该类的对象,虽然他们访问不同方法,但是他们使用同一个对象来调用,那么这些方法的锁就是一样的,就是这个对象,那么会造成阻塞。如果多个线程通过不同的对象来调用方法(一般都是通过同一个对象访问),那么他们的锁就是不一样的,不会造成阻塞。
Hashtable中使用Synchronized来修饰方法,这样相当于对整张表进行锁定了,因为多个线程如果通过同一个HashTable对象访问方法,就会造成阻塞。
但是,通过同一个对象调用非同步方法,是可以的,不会阻塞。
二、synchronized修饰静态方法(类锁)
锁是类锁(.class)。这个范围就比对象锁大。这里就算是不同对象,但是只要是该类的对象,就使用的是同一把锁。多个线程调用该类的同步的静态方法时,都会阻塞。