1:同步代码块
syschronized(同步监视器(锁)){
操作共享数据的代码
}
同步监视器(锁):由一个类的对象来充当,哪个线程获取锁,谁就执行同步的代码块。要求:所有的线程必须公用同一把锁!(在实现Runnable,可以用this充当锁,在继承中,小心使用this,可能会导致线程用的并不是同一把锁)
2:同步方法
操作共享数据的方法声明为synchronized,同步方法的锁:this,所以在继承Tread的时候,使用同步方法可能会出现问题
释放锁的操作
- 同步方法或者同步代码块执行结束
- 同步方法或者同步代码块,出现未处理的error或者exception的异常
- 同步方法或者同步代码块,执行线程对象的wait()的方法
不会释放锁的操作
- Thread.sleep()和Thread.yield()暂停当前线程的执行
- 同步方法或者同步代码块,其他线程调用了该线程的suspend()方法,将该线程挂起