引言:线程安全问题
什么是线程安全问题?当多个线程并发的访问一个Java对象时,无论系统如何调度这些线程,这个对象都能表现出一致的、正确的行为,那么我们就说对这个对象的操作是线程安全的。反之,对这个线程的操作不是线程安全的,发生了线程安全问题。
本文将回答如下几个问题:synchronize是如何保证线程安全的?
synchronize加锁到底是怎么加的?
锁信息放在Object对象的什么位置?
如何查看锁升级的具体过程?
等等。
关于synchronize的使用场景、synchronize与ReentryLock有什么区别将在下一期介绍Lock的博客中给出。
Java内置锁的核心原理
Java内置锁是一种互斥(独占)锁。当线程A占有一个对象的锁,线程B也想要尝试获取这个对象的内置锁时,线程B会等待或阻塞,直到线程A执行完成后后释放锁(抛出异常也会释放),如果线程A不释放,线程B将会永远等待下去。
Java中的每个对象都已可用作内置锁。线程进入同步代码块时会自动获取改锁,在退出代码块时会自动释放该锁。
1. synchronized关键字
synchronize关键字的使用方式有三种:
1.修饰一个普通方法
public synchronized