产生原因:多个线程竞争同一资源(访问同一数据),可参考经典的生产者消费者问题。
解决方案:run 方法内:同步代码块 synchronized {}
Public synchronized 返回值类型 方法名(){
} 自动释放对象锁
使用 Lock 锁 Lock 锁需要程序员(在 finally 代码块中)手动释放。
Lock lock=new ReentranttLock() // Reentrant(可重用的)
Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作,是 JDK1.5 之后出现的。
Lock 接口中的方法:
void lock() // 获取锁
void unlock() // 释放锁