|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
第二章:对象及变量的并发访问 解决线程安全问题
非线程安全 例如多个线程对同一个对象中的实例变量访问并改变
解决方法:将变量设为方法内部的私有变量
关键字synchronized同步锁 取得都是对象锁 该方法所属对象的锁Lock
当多个线程访问一个对象,且该对象被synchronized关键字标记,则先执行的线程,就拥有该对象的锁,其他线程只能等待
当多个线程访问多个对象时,JVM会创建多个锁
Synchronized同步 asynchronized异步
只有共享的资源才需要同步化 调用关键字synchronized声明的方法一定是排队运行的
线程A先持有object对象的锁,则线程只能调用object对象里的非synchronized类型的方法 也就是异步调用
当两个线程调用同一个对象,对象只有两个同步方法,例如线程A先持有object对象的锁,则线程B无法调用对象的同步方法,需要等待,也就是同步
脏读 多线程不只是在变量赋值环节出现数据交叉 在读值环节也有 脏读
在线程A未完成方法,线程B就已经执行读取变量数据,造成数据出错
Synchronized 锁重入
在一个synchronized方法块的内部调用本类的 其他synchronized方法块时,可永远得到锁
出现异常 锁自动释放
同步不具有继承性
用同步代码块解决同步方法的弊端
声明另一个类对象,并不存在,可作为本抽象类参数,则该抽象类为动态
如果new另一个类对象作为参数,当做为本抽象类参数时,该抽象类为静态,因为参数已经是存在的类对象
一半异步 一半同步
异步部分线程随机执行 同步部分先得到对象锁的线程先执行,其他线程只能等待、
synchronized 同步代码块
synchronized this(){}
synchronized 代码块之间的同步性
当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对同一个object中其他所有的synchronized(this)同步代码块的访问将被阻塞
说明 synchronized使用的 “对象监视器”是一个
与synchronized方法一样 synchronized(this)代码块也是锁定当前对象的
将任意对象作为对象监视器
Synchronized(非this对象) {同步代码块}
Synchronized(非this对象)与 synchronized()方法同时使用,为异步调用
因为对象监视器不同,所以结果为异步
但是synchronized()方法与synchronized(this)方法是同一个对象监视器
当多线程执行带有判断的方法if(){}时,就会出现逻辑上的错误,有可能出现脏读 if执行代码中的方法为synchronized同步,但是if方法没有synchronized同步,因此线程A,线程B会进入if判断,假设线程A先取得if方法代码块对象锁,未执行完毕,对象锁不释放,且判断值未改变,这时线程B趁机if判断通过,等线程A释放对象锁,则执行代码块,造成脏读
Synchronize(对象X) 3个结论
1、当多个线程同时执行synchronized(x){}同步代码块时呈现同步效果
2、当其他线程执行x对象中的synchronized同步方法时呈同步效果
3、当其他线程执行x对象方法里面的synchronized(this)代码块时呈现同步效果
有理解不对的地方还希望大家多多指点~!谢谢~ |
-
评分
-
查看全部评分
|