线程概念
synchronized用法
public synchronized void push()
{ ... }
等价于
public void push()
{
synchronized (this) {
...
}
}
所有的非静态同步方法用的都是同一把锁——实例对象本身
而所有的静态同步方法用的也是同一把锁——类对象本身(Xxx.Class)
记住一点,加锁的关键在于让多个线程在同一个对象上等待,即当前对象this,应该去锁定的是对某个共享数据的读写,而不是“锁一段代码”。
锁的原理
Java中每个对象都有一把内置锁,当线程运行到同步方法上时自动获得当前对象(实例对象或类对象)有关的锁
小结
- 只能同步方法,而不能同步变量和类
- 每个对象只有一个锁
- 不必同步类中所有的方法,类可以同时拥有同步和非同步方法
- 如果一个线程在对象上获得一个锁,就没有任何其他线程可以进入(该对象的)类中的任何一个同步方法。
- 如果线程拥有同步和非同步方法,则非同步方法可以被多个线程自由访问而不受锁的限制
- 线程睡眠(sleep)时,它所持的任何锁都不会释放(wait则放开锁)
- 线程可以获得多个同步(synchronized )锁。比如,在一个对象的同步方法里面调用另外一个对象的同步方法,则获取了两个对象的同步锁
- 静态同步方法和非静态同步方法将永远不会彼此阻塞,因为静态方法锁定在Class对象上,非静态方法锁定在实例对象上