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