Java多线程编程核心技术( 二 )


拥有锁重入的功能 , 也就是在使用时 , 当一个线程得到一个对象锁后 , 再次请求此对象锁时是可以再次得带该对象的锁的 , 这就证明在一个方法/块的内部调用本类的其他方法/块时 , 是永远可以得到锁的 。
当存在父子类继承关系时 , 子类是完全可以通过“可重入锁”调用父类的同步方法的 。
10.4 出现异常 , 锁自动释放
当一个线程执行的代码出现异常时 , 其所持有的锁会自动释放 。
10.5 同步不具有继承性
11.同步代码块
使用声明方法在某些情况下是有弊端的 , 比如A线程调用同步方法执行一个长时间的任务 , 那么B线程则必须等待比较长的时间 , 这种情况是可以使用同步语句块来解决 。
11.1 同步代码块的使用
当两个并发线程访问同一个对象中的(this)同步代码块时 , 一段时间内只能有一个线程被执行 , 另一个线程必须等待当前线程执行完这个代码块后才能呢个执行该代码块 。

Java多线程编程核心技术

文章插图
11.2 用同步代码块解决同步方法的弊端
当一个线程访问的一个同步代码块时 , 另一个线程仍然可以访问该对象中的非(this)同步代码块 。
虽然时间缩短 , 运行效率加快 , 但同步代码块真的是同步吗真的持有当前调用对象的锁吗?
---是 , 但必须通过代码的方式验证 。
一半同步 , 一半异步:不在块中的就是异步的 , 在块中就是同步的 。
11.3 代码块间的同步性
在使用同步(this)代码块时应该注意:
当一个线程访问的一个(this)同步代码块时 , 其他线程随同一个中所有其他(this)同步代码块的访问江北阻塞 , 这说明使用的“对象监视器” 。
(this)代码块是锁定当前对象的 。
11.4 将任意对象作为对象监视器
多个线程调用同一个对象中的不同名称的同步方法或者(this)同步代码块时 , 是按照顺序执行的 , 也就是同步的 , 阻塞的 。
说明同步方法或者(this)同步代码块分别有两种作用:
方法:
1.对其他同步方法或(this)同步代码块调用呈阻塞状态
2.同一时间只有一个线程可以执行同步方法中的代码
(this)同步代码块:
1.对其他同步方法或者(this)同步代码块调用呈阻塞状态
2.同一时间只有一个线程可以执行(this)同步代码块中的代码
在多线程只有“对象监视器”为同一个对象的前提下 , 同一时间只有一个线程可以执行(非this对象x)同步代码块中的代码
当持有“对象监视器”为同一个对象的前提下 , 同一时间室友一个线程可以执行(非this对象x)同步块中的代码 。
锁非this对象
如果在一个类中有多个方法 , 这时虽然能实现同步 , 但会受到阻塞 , 所以影响运行效率 , 但如果使用同步代码块锁非this对象 , 则(非this)代码块中的程序与同步方法是异步的 , 不与其他锁this同步方法争抢this锁 , 则可大大提高运行效率 。
使用(非this对象x)同步代码块格式进行同步操作时 , 对象监视器必须是同一个对象 , 如果不是同一个对象监视器 , 运行的结果就是异步调用了 , 就会交叉运行 。
??
同步代码块放在菲同步方法中进行声明 , 并不能保证调用方法的线程的执行同步/顺序性 , 也就是线程调用方法的顺序是无需的 , 瑞瑞在同步块中执行的顺序是同步的 , 这样极易出现脏读