参考两篇文章:
http://www.cnblogs.com/benshan/p/3551987.html
http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html
synchronized总结:
- synchronized 可以修饰:方法、代码块
- synchronized 获得的锁有两种:对象锁、类锁
- 同一时间只有一个线程可以访问某个锁控制的 所有 同步函数/块。
- 一旦一个线程获得锁后,仅当同步块执行完之后,才会释放锁(即使使用notify()主动释放锁,也不会立即释放,而是等同步块内的代码执行完之后才释放。当然wait()可以阻塞自己,从而释放对象锁)
- 非同步块/函数内的代码不受锁控制,允许多个线程同时访问。
进一步解释:
- 类锁:对用static修饰的类方法加锁。因为static修饰,也就是类方法,不需要实例化,可以直接通过类名调用。这种锁就是指这个类的所有类方法,同一时间只能有一个线程访问。
- 对象锁:没有用static修饰的,加上的锁都是对象锁。即对该类实例(对象)的所有同步方法,同一时间只有一个线程访问。
- 方法是通过对象或者类调用。通过类调用的即用static修饰的类方法。因此一旦获得了某个对象锁/类锁,那么所有被该锁锁上的同步块/函数,同一时间都只有一个线程能访问。其中synchronized(this)获得的也是当前对象的对象锁。