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


使用(非this对象x)同步代码块也可以解决脏读问题 。
(非this对象x):
1.当多个线程同时执行(x){}同步代码块时呈同步效果
2.当其他线程执行x对象中同步方法时呈现同步效果
3.当其他线程执行x对象方法里面的(this)代码块时也呈现同步效果 。
12.静态同步方法与(class)代码块
用在静态方法 , 是不对当前的*.java文件对应的Class类进行持锁 。
13.数据类型的常量池对象
JVM中具有常量池混村功能

Java多线程编程核心技术

文章插图
在大多数情况下 , 代码块都不会私用作为锁对象 , 而改用其他 , 比如new ()十里花一个对象 。
14.同步方法无线等待与解决
同步块解决
15.线程的死锁
使用jdk自带的工具检测是否有死锁:执行bin目录下的jps命令 , 得到运行线程 的id值 , 再执行命令
16.锁对象的改变
在将任何数据类型作为同步锁时 , 需要注意:是否有多个线程同伙私持有锁对象 , 如果同时持有相同的锁对象 , 则这些线程之间就是同步的 , 如果分别获得锁对象 , 这些线程之间就是异步的 。
只要对象不变 , 及时对象的属性变了 , 运行的结果还是同步的 。
Java多线程编程核心技术

文章插图
17.关键字
作用是使变量在多个线程间可见:强制从公共堆中取得变量的值 , 而不是从线程的私有数据栈中取得变量的值 。
但是不支持原子性 。
和的比较:
1.是线程同步的轻量级实现 , 所以性能肯定比要好 , 并且只能修饰变量 , 而可以修饰方法的代码块 , 随着jdk新版本的发布 , 关键字在执行效率上得到很大提升 , 在开发中使用关键字的比率还是比较大的 。
2.多线程访问不会发生阻塞 , 而会发生阻塞 。
3.能保证数据的可见性 , 但不能保证原子性 , 而可以保证原子性 , 也可以间接保证可见性 , 因为他会将私有内存和公共内存中的数据做同步 。
4.解决的是变量在多个线程之间的可见性 , 而解决的是多个线程之间访问资源的同步性 。
线程安全包含原子性和可见性 , java同步机制都是围绕这两个方面来确保线程安全 。
18.线程间的通信
18.1 等待/通知机制:wait()/()
wait():
使当前执行代码的线程进行等待 , wait(0是的方法 , 该方法用来将当前线程置入“预执行队列”中 , 冰吻在wait()所在的代码处停止执行 , 直到接到通知或者被中断为止 。在调用wait()前 , 线程必须获得该对象的对象级别锁 , 即只能在同步方法或者同步块中调用wait() , 在执行wait()后 , 当前线程释放锁 。在从wait()返回前 , 线程与其他线程竞争重新获得锁 。如果调用wait()时没有持有适当的锁 , 则抛出 , 是的子类 , 不需要try..catch语句进行捕捉异常 。
():
也需要用在同步方法或者同步块中 , 即在调用前 , 线程必须获得该对象的对象级别锁 , 如果调用()时没有持有适当的锁 , 抛出 。该方法用来通知那些可能等待该对象的对象锁的其他线程 , 如果有多个线程等待 , 则有线程规则器随机挑选出一个呈wait状态的线程 , 对其发通知,并使它等待获取该对象的对象锁 。在执行()后 , 当前线程不会马上释放该对象锁 , 呈wait状态的线程也不能马上获取该对象锁 , 要等待执行()方法的线程将程序执行完 , 也就是退出代码块后 , 当前线程才会释放锁 , 呈wait状态所在的线程才可以获取该对象锁 。当第一个获得了该对象锁的wait线程执行完后 , 它会释放掉该对象锁 , 此时如果该对象没有在此使用语句 , 则即便该对象已经空闲 , 其他wait状态等待的线程由于没有得到该对象的通知 , 还会继续阻塞在wait状态 , 直到这个对象发出一个或者 。