鱼C论坛

 找回密码
 立即注册
查看: 3717|回复: 2

[学习笔记] Java多线程06

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

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

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

x
线程安全包含原子性和可见性两个方面   Java同步机制都是围绕着两个方面确保线程安全
Synchronized与Volatile比较
1、volatile是线程同步的轻量级的实现,性能比synchronized要好
2、volatile只修饰于变量     synchronized可以修饰方法以及代码块
3、volatile不会发生阻塞   synchronized会阻塞
4、volatile可以保证数据的可见性  synchronized可保证数据的原子性以及简洁保证可见性(它会将私有内存和公共内存中的数据做同步)
5、volatile解决的是变量在多个线程之间的可见性
      synchronized解决的是多个线程之间访问资源的同步性

Java中的数组是一个对象 特殊的对象

Volatile不具备同步性,那么也就不具备原子性
变量在内存中工作的过程:
1、read和load阶段:从主存复制变量到当前线程工作内存
2、use和assgin阶段:执行代码 改变共享变量值
3、store储存和write阶段:用工作内存数据刷新主存对应变量的值
14.png

在i++操作时可使用synchronized关键字实现同步外,还可以使用AtomicInteger原子类实现
可以在没有锁的情况下做到thread-safe

原子类并非完全安全
原子类在具有有逻辑性的情况下输出结果也具有随机性
15.png
由于addAndGet()方法是原子性的,但是方法使用两次,方法和方法之间的调用却不是原子性的,多线程之间可以随意调用,不必等一个线程完全执行完addNum()方法
为了解决输出结果随机性,需要给addNum()方法加上关键字synchronized

关键字synchronized
1、可以使多个线程访问同一个资源具有同步性
2、可以将多线程工作内存中的变量和公共内存中的变量同步

学习多线程  外练互斥 内修可见

对象数组 类作为一种数据类型,创建对象数组  与直接用类new对象相似

控制反转

评分

参与人数 2荣誉 +5 鱼币 +9 收起 理由
小甲鱼 + 4 支持楼主!
零度非安全 + 5 + 5 热爱鱼C^_^

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-6-18 00:06:38 | 显示全部楼层
内容不错,排板也比之前进步许多,nice
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-18 10:39:33 | 显示全部楼层
零度非安全 发表于 2017-6-18 00:06
内容不错,排板也比之前进步许多,nice

哈哈~谢谢,我会继续努力的~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-14 13:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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