线程通信:线程之间通过共享内存,消息传递的方式进行通信:共享内存通过读取内存中的公共状态来达到彼此间的通信 - 其过程是隐式的;消息传递则没有公共状态必须明确发送消息进行通信如:wait(),notify()。java线程通信是隐式的透明的。java线程通信由JMM控制。
线程改变变量的过程:每个线程都会有自己的本地内存 - 本地内存中的变量直接从主内存中拷贝到自己的本地内存中,多线程不可访问其他线程的本地内存,本地内存仅自己可见。当一个线程试图去改变主内存中变量值得时候需经过以下步骤:图 -
当多个线程共享主内存中的一个变量时 - 流程如下:
线程阿通信线程乙需经过主内存方可通信。共享变量
JVM对内存(软件层次)划分为堆,栈:
计算机硬件内存与JVM内存:
当在多线程情况下若没有对线程进行同步则:
线程甲从内存读取数据Ť到JVM中,线程甲对数据Ť进行修改但是未刷新到内存中去;此时线程乙又从内存中读取数据T,此时数据Ť并不是线程甲修改后的值。
则此时需要使用synchronized同步对线程进行同步,仅有一个线程对数据进行操作,其他线程等待操作结束继续操作;使用volatile修饰变量则可以保证线程每次读到数据 总是最新的。