今天学习了java线程同步的synchronized用法,当监视器对象为Object时,总结了如下知识点:
synchronized同步方法
1、synchorized修饰非静态方法时,synchorinzed获得的锁都是对象锁,而不是把一段代码或方法当作锁,哪个线程先执行synchronized方法,哪个线程就持有该方法所属对象的锁Lock,那么其他线程只能呈等待状态,前提是多个线程访问的是同一个对象。如果多个线程访问多个对象,则JVM会创建多个锁。
2、A线程先持有object对象的Lock锁时,B线程可以以异步的方式调用object对象中的非synchronized类型的方法,但是如果调用synchronized类型的方法则需等待A线程释放object对象的Lock锁。
3、synchronized拥有锁重入功能,也就是在使用synchronized时,当一个线程得到一个对象锁后,再次请求改对象锁时是可以再次得到该对象锁的,也就是说一个synchronized方法内部可以调用本类其他synchronized方法,这是为了防止死锁。
4、当一个线程执行的代码出现异常时,其所持有的锁会自动释放。
5、同步不具有继承性
synchronized同步语句块
用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行很长时间,B线程则必须等待比较长的时间。这种情况下可以使用synchronized同步语句块来解决。代码格式:
synchronized(this){
}当两个并发线程访问同一个Object中的synchronized(this)同步代码时,一段时间内只能拥有一个线程被执行,另一个线程必须等待当前线程执行完这个代码以后才能执行该代码块。但是另一线程可以当问Object中非synchronized(this)同步代码块。
当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对同一个Object中所有其他synchronized(this)同步代码块的访问将被阻塞,这说明synchronized使用的对象监听器仍是一个。和synchronized方法一样,synchronized(this)代码块也是锁定当前对象的。
将任意对象作为对象监视器
java支持对“任意对象”作为“对象监视器”来实现同步的功能。这个“任意对象”大多数是实例变量及方法的参数,使用格式为synchronized(非this)对象。锁非this对象具有一定的优势:如果一个类中有很多个synchronized方法,这时虽然可以同步,但是受到阻塞,影响运行效率。如果使用同步代码块锁非this对象,则synchronized(非this)代码块中的程序与同步方法时异步的,不与其他锁this同步方法争抢this锁,大大提高运行效率。
synchronized(非this对象)格式的作用只有1种:synchronized(非this对象)同步代码块:
- 在多个线程持有“对象监视器”为同一个对象的前提下,同一时间只有一个线程可以执行synchronized(非this对象)同步代码块中的代码。
- 当持有“对象监视器”为同一个对象的前提下,同一时间只有一个线程可以执行synchronized(非this对象)同步代码块中的代码。
本文详细介绍了Java中synchronized关键字的使用方法,包括其在不同情况下的锁机制、锁重入功能、异常处理机制等,并对比了synchronized方法与同步语句块的区别。
1364

被折叠的 条评论
为什么被折叠?



