java 多线程基本知识

来源:互联网 发布:淘宝直销店是正品吗 编辑:程序博客网 时间:2024/06/05 00:21
多线程voliation应用。
对于多线程并发操作。每个线程都有自己独立的工作内存空间,对于volication修饰的变量。有两个作用。
第一:保证变量的可见性。
由于全局变量存放在堆中,因此当多线程并发访问的时候对于变量的操作是这样的过程。首先先把变量复制一份到自己的工作内存中,然后处理完之后,再把新值送到主内存,其他的线程也都是通过主内存与线程之间进行数据交换的。而对于volication修饰的变量,专业解释是保证所有的线程对数据都是可见的。意思就是说,当一个线程把一个变量赋予新的值的时候,此时加入并没有把新的数据同步到主内存中,但是此时执行引擎会刷新内存,所以其他线程也就看到了数据的新的数据值,也就是其他线程读取的是volication修饰的变量修改后的数据
。而一般的变量则不可以,一般的变量只有当数据同步到主内存之后他们才可以得到最新的数据值。当然不难发现,如果一线程正在对于volication修饰的数据进行操作,因为java的数据操作并不是原子性的即必须读数据和写数据两个过程。就在此刻其他线程读了这个数据,这样就有可能操作另外的线程读到的并不是最新的数据。所以volication修饰的变量是在自己的工作内存中修改之后,此时还没有同步到工作内存,但是因为被这个关键字修饰了,所以其他线程是可以看到的。但是如果在自己工作内存中修改过程中其他线程读了主内存的数据,由于他在自己工作内存中还没有修改成功,因此此时并不能保证线程安全,因此volication修饰的数据如果有其他线程使用并不能保证线程安全。
第二:保证数据禁止虚拟机重排序。
对于java源代码首先前段编译器编译成class文件,然后再通过后端即使编译器把class文件编译成机器指令。可以通过javap指令,查看编译后的class文件。所谓指令重排序就是可能有些电脑是多核处理器或者多级缓存。那么可以对这些质量重排序,以便更加执行机器环境的运行,提高并发效率。而如果用次修改变量,那么就会禁止重排序,那么指令就可以按照代码写的顺序顺序执行。


第三:主内存和工作内存
java内存模型主要是规范线程之间的交互。分为主内存和工作内存。工作内存有缓存,堆,栈组成。缓存中存放主内存的数据副本,每个线程都有自己的工作内存,各个线程之间的数据交互都需要通过主内存来完成。各个线程之间无法访问各自线程内部的数据。而对于工作
内存中的缓存数据,并不会立即同步到主内存中,因此也就存在线程安全的问题。