线程同步
多个线程访问同一个对象,会产生并发问题。这个时候需要线程同步,就是一个等待机制。多个需要同时访问此对象的线程进入这个对象等待池, 形成列队等待前面线程使用完毕, 下一个线程再使用。
线程同步每个对象都需要一把锁,用来解决线程同步锁机制(synchronized),当一个线程获得对象得排它锁,独占资源,其他线程必须等待,使用后释放锁即可。
但是会存在问题:
- 一个线程持有锁会导致其他所有需要此所的线程挂起。
- 在多线程竞争下,加锁,释放锁会导致比较多的上下文切换和调度问题,引起性能问题
- 如果一个优先级高的线程等待一个优先级低的线程释放锁,会导致优先级倒置,引起性能问题。
锁:
锁的对象就是变化的量 增删改。
死锁:
多个线程相互抱着对方需要的资源,然后形成僵持。 例如:两个小朋友有ab两个玩具。现在想交叉给,a想要b玩具。b想要a玩具,但是谁都不愿意先给。这时候就会出现问题(死锁)。
Lock和synchronized区别
Lock是显示锁需要手动开启关闭。synchronized是隐世锁,出了作用域会自动释放。 Lock只有代码块锁,synchronized有代码块和方法锁。 使用Lock锁,JVM将花费较少的时间来调度线程,线程更好。并且具有更好的扩展性(提供更多的子类)。比如ReentrantLock可重复锁