java 理解多线程及线程可见性

  1. 进程,线程
    进程:程序(任务)的执行过程,是动态的;持有资源(内存,文件)和线程,是资源和线程的载体。
    线程:线程是系统中最小的执行单元,同一进程中有很多线程,线程共享进程的资源。
  2. java对线程的支持
    java的lang包中包含thread类和runnable接口
  3. 线程中常用的方法和含义
    ThreadTest程序
    这里写图片描述
  4. 如何正确停止线程
    Stop()方法来停止线程,不合适。会突然停止,对于那些执行完了,哪些没有会有疑惑。正确的方法是设置退出标志:当标志是false的时候,停止线程。
    Interrupt()方法不是为了停止线程
  5. 线程交互
    ThreadTest程序
    四. Java多线程内存可见性
  6. 作用,解决数据争用的问题。
  7. 可见性:一个线程对共享变量值得修改,能够及时的被其他线程看到
    共享变量:一个变量可以被多个线程使用,那么这个变量就是这几个线程的共享变量。
  8. 线程对共享变量的读写都必须在自己的工作内存中进行,而不能直接在主内存中读写。不同线程不能直接访问其他线程的工作内存中的变量,线程间变量值的传递需要主内存作为桥梁。
    这里写图片描述
  9. 线程可见性原理:
    线程一对共享变量的改变想要被线程二看见,就必须执行下面两个步骤:①将工作内存1中的共享变量的改变更新到主内存中②将主内存中最新的共享变量的变化更新到工作内存2中。
  10. 可见性在语言层面的实现方式:synchronized 和 volatile
  11. Synchronized能够实现原子性(同步)和可见性。
    JMM对synchronized的两条规定:线程解锁前,必须把共享变量的最新值刷新到主内存中(在推出synchronized代码块的时候,共享变量的最新值已经刷新到主内存中);线程加锁时,将清空工作内存中共享变量的值,使在使用共享变量的时候必须重新在主内存中加载最新的值(注意,加锁解锁必须用同一把锁)。这样保证了线程可见性。
  12. 导致线程共享变量不可见的几点原因:
    线程的交叉执行,重排序加线程交叉执行,共享变量更新后的值没有在工作内存和主内存中及时更新。
  13. Volatile通过内存屏障和禁止重排序来实现线程可见性。但不能保证原子性
  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值