鱼C论坛

 找回密码
 立即注册
查看: 3730|回复: 0

[学习笔记] Java多线程学习03

[复制链接]
发表于 2017-6-12 22:24:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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)代码块时呈现同步效果

有理解不对的地方还希望大家多多指点~!谢谢~
01.png

评分

参与人数 1鱼币 +4 收起 理由
小甲鱼 + 4

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 17:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表