什么是Java对象锁
Java对象锁是一种同步机制,用于协调多个线程对共享资源的访问。
在Java中每个对象都与一个监视器相关联,这个监视器可以被线程获取,从而控制对对象的访问。
Java对象锁作用
Java对象锁的主要作用是协调多个线程对共享资源的访问,确保在任意时刻只有一个线程可以执行被锁定的代码块或方法。
除此之外,使用对象锁是实现线程安全性的一种重要手段。
通过对象锁,可以将一系列操作组合成原子性操作,即这些操作要么全部执行成功,要么全部不执行。
Java对象锁实现
Java对象锁是通过synchronized
关键字来实现的,如下所示:
public class Example { private Object lock = new Object(); public void synchronizedBlock() { synchronized (lock) { // 同步块 } } }
当一个线程希望访问一个被synchronized
修饰的方法或代码块时,它必须先获得对象锁。
如果对象锁已经被其他线程持有,那么该线程就会被阻塞,直到它能够获取到锁为止。
一旦线程获取到对象锁,它就可以执行相应的代码,而其他线程则不能同时访问这段被锁定的代码。
Java对象锁原理
Java对象锁的实现原理涉及到Java中的监视器、内置锁(Intrinsic Lock)和线程的状态切换。
1.监视器对象(Monitor Object)
每个Java对象都与一个监视器相关联,这个监视器用于控制对对象的访问,监视器对象是实现同步的基础。
如下图所示:
上图是Synchronized同步代码块反编译后的截图,可以很清楚的看见monitor的调用,主要就是上图红色的monitorenter和monitorexit来实现,获取锁与释放锁。
2.内置锁(Intrinsic Lock)
每个Java对象都有一个内置锁,也称为监视器锁(Monitor Lock)或对象锁,这个锁是与对象关联的,用于协调多个线程对对象的访问。
当一个线程进入synchronized
修饰的方法或代码块时,它会尝试获取对象的内置锁。
如果锁已经被其他线程持有,线程将被阻塞直到获取到锁为止。
3.线程的状态切换
当一个线程尝试获取对象锁而失败时,它会进入一个等待状态,等待其他线程释放锁。
这通常涉及到操作系统层面的线程状态切换,如从运行状态到阻塞状态。
当持有锁的线程执行完synchronized
代码块或方法时,它会释放锁,同时通知等待中的线程,使其中的一个线程有机会获取锁。
陈睿mikechen
十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》