2023年java安全线程..(范文推荐).docx
《2023年java安全线程..(范文推荐).docx》由会员分享,可在线阅读,更多相关《2023年java安全线程..(范文推荐).docx(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2023年java安全线程.(范文推荐)下面是我为大家整理的java安全线程.(范文推荐),供大家参考。最近想将 java 基础的一些东西都整理整理, 写下来, 这是对知识的总结,也是一种乐趣。已经拟好了提纲, 大概分为这几个主题:java 线程安全, java垃圾收集, java 并发包详细介绍, java profile 和 jvm 性能调优 。慢慢写吧。本人 jameswxx 原创文章, 转载请注明出处, 我费了很多心血, 多谢了。关于 java线程安全, 网上有很多资料, 我只想从自己的角度总结对这方面的考虑, 有时候写东西是很痛苦的, 知道一些东西, 但想用文字说清楚, 却不是那么容
2、易。我认为要认识 java 线程安全, 必须了解两个主要的点:java 的内存模型, java 的线程同步机制。特别是内存模型, java 的线程同步机制很大程度上都是基于内存模型而设定的。后面我还会写 java 并发包的文章, 详细总结如何利用 java 并发包编写高效安全的多线程并发程序。暂时写得比较仓促, 后面会慢慢补充完善。 浅谈 java 内存模型 不同的平台, 内存模型是不一样的, 但是 jvm 的内存模型规范是统一的。其实 java 的多线程并发问题最终都会反映在 java 的内存模型上, 所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改。总结 java 的内存模型,要
3、解决两个主要的问题:可见性和有序性。我们都知道计算机有高速缓存的存在,处理器并不是每次处理数据都是取内存的。JVM 定义了自己的内存模型, 屏蔽了底层平台内存管理细节, 对于 java 开发人员, 要清楚在 jvm 内存模型的基础上,如果解决多线程的可见性和有序性。 那么, 何谓可见性?多个线程之间是不能互相传递数据通信的, 它们之间的沟通只能通过共享变量来进行。Java 内存模型 (JMM)规定了 jvm 有主内存,主内存是多个线程共享的。当 new 一个对象的时候, 也是被分配在主内存中, 每个线程都有自己的工作内存, 工作内存存储了主存的某些对象的副本, 当然线程的工作内存大小是有限制的
4、。当线程操作某个对象时, 执行顺序如下: (1)从主存复制变量到当前工作内存 (read and load) (2)执行代码, 改变共享变量值 (use and assign) (3)用工作内存数据刷新主存相关内容 (store and write) JVM 规范定义了线程对主存的操作指令:read, load, use, assign, store, write。当一个共享变量在多个线程的工作内存中都有副本时, 如果一个线程修改了这个共享变量, 那么其他线程应该能够看到这个被修改后的值, 这就是多线程的可见性问题。那么, 什么是有序性呢 ? 线程在引用变量时不能直接从主内存中引用,如果线程工
5、作内存中没有该变量, 则会从主内存中拷贝一个副本到工作内存中,这个过程为 read-load, 完成后线程会引用该副本。当同一线程再度引用该字段时, 有可能重新从主存中获取变量副本(read-load-use) , 也有可能直接引用原来的副本 (use) , 也就是说 read, load, use 顺序可以由 JVM 实现系统决定。线程不能直接为主存中中字段赋值, 它会将值指定给工作内存中的变量副本(assign) , 完成后这个变量副本会同步到主存储区(store- write) , 至于何时同步过去, 根据 JVM 实现系统决定. 有该字段, 则会从主内存中将该字段赋值到工作内存中, 这
6、个过程为 read-load, 完成后线程会引用该变量副本, 当同一线程多次重复对字段赋值时, 比如:Java 代码 1.for(int i=0; ilt;12. a+;线程有可能只对工作内存储区, 所以 assign, stor享变量 x, 线程 a 执行 x操作, 它的执行过程如下1 从主存中读取变量 x 副2 给 x 加 1 3 将 x 加 1 后的值写回主如果另外一个线程 b 执行1 从主存中读取变量 x 副2 给 x 减 1 3 将 x 减 1 后的值写回主那么显然, 最终的 x 的值减 1, 从表面上看, 似乎最1:线程 a 从主存读取 x2:线程 b 从主存读取 x3:线程 a
7、将工作内存中4:线程 a 将 x 提交主存5:线程 b 将工作内存中6:线程 b 将 x 提交到中同样, x 有可能为 11, 如这样是有严重问题的, 要并且每个线程执行的加 1Java 代码 1.public class Ac2. 3.private int4. 5.public Acco6.this. ba7. 8. 9.public int 10. return 11. 12.0; i+) 存中的副本进行赋值, 只到最后一次赋值后re, weite 顺序可以由 JVM 实现系统决定。x=x+1。从上面的描述中可以知道 x=x+1 并下:副本到工作内存 主 存 行 x=x-1, 执行过程如
8、下:副本到工作内存 主存值是不可靠的。假设 x 现在为 10, 线程 a 加最终 x 还是为 10, 但是多线程情况下会有这副本到工作内存, 工作内存中 x 值为 10 副本到工作内存, 工作内存中 x 值为 10 x 加 1, 工作内存中 x 值为 11 存中, 主存中 x 为 11 x 值减 1, 工作内存中 x 值为 9 主存中, 主存中 x 为 9如果 x 是一个银行账户, 线程 a 存款, 线程要解决这个问题, 必须保证线程a和线程b 是1 或减 1 是一个原子操作。看看下面代码:ccount balance; ount(int balance)alance = balance; g
9、etBalance()balance; 后才同步到主存假设有一个共并不是一个原子加 1, 线程 b这种情况发生:程 b 扣款, 显然是有序执行的,13. public void add(int num)14. balance = balance + num; 15. 16.17. public void withdraw(int num)18. balance = balance - num; 19. 20.21. public static void main(String args)throws InterruptedException 22. Account account = new
10、Account(1000) ; 23. Thread a = new Thread(new AddThread(account,20) ,add) ; 24. Thread b = new Thread(new WithdrawThread(account,20) ,withdraw) ; 25. a. start() ; 26. b. start() ; 27. a. join() ; 28. b. join() ; 29. System. out. println(account. getBalance() ) ; 30. 31.32. static class AddThread imp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2023 java 安全 线程 范文 推荐
限制150内