线程安全
出现原因:多个线程操作同一个资源,容易出现脏数据
解决方案:多个线程操作统一资源,必须加锁,让多个线程互斥
经验:想要多个线程互斥,就必须使用用一个锁对象
实现方案
-
synchronized
- 同步锁-
同步代码块
private static Object object = new Object(); synchronized(object){ ...想要锁住的代码.... } //自动解锁
-
同步方法
//同步的成员方法 - 锁对象: this public synchronized void method(){} //同步的静态方法 - 锁对象: 该类的 .class 对象 public synchronized static void method1(){}
-
-
lock()
手动上锁、手动解锁
Lock lock = new ReentrantLock(); ... //手动上锁 - 锁对象: lock lock.lock(); ... //手动解锁 lock.unlock();
使用方法
//设置为静态对象就是唯一共享的lock对象,即使该类被实例化多例 private static Lock lock = new ReentrantLock(); ... try{ //上锁 lock.lock(); }catch(异常类型 e){ ...异常处理... }finally{ //finally部分解锁:保证try部分代码上的锁无论如何都会解锁 lock.unlock() }