在并发编程的时候,线程之间的通行需要我们考虑.在java中线程通信依靠两种机制:
共享内存与消息传递
共享内存:
在java中,所有的实例域,静态域,和数组元素都在堆内存中,这部分内存所有线程共享.
局部变量,方法定义的参数和异常处理器参数是线程独享的
java线程之间的通信,有jmm控制,jmm决定一个线程堆共享变量的写入何时对另一个线程可见,定义了线程与本地内存的关系.每个线程在执行的时候,都会去主内存中复制一份线程执行需要数据的副本放在自己线程的栈上,在线程操作的时候,会通过操作栈上的数据,这就导致了线程访问堆上的数并不一定是最新的,对于这种情况我们可以考虑使用volatile来保证数据的可见性.
volatile的作用是当栈上数被修改时候,会去堆区修改,并且让其他线程上取得的指向这个数据的副本全部失效,必须要来堆区获取最新的值,这样保证了可见性.
synchronized可以修饰代码块,方法,他可以保证同一个时刻只有一个线程处于方法或代码块中,他的地城cpu实现原理是通过获取对象监视器实现的,获取对象监视器这个过程是排他的,保证了同一个时刻只有一个线程可以访问,每一个对象都有自己的监视器.执行方法的线程必须获取对象监视器才能进入同步代码块,而没有获取监视器的线程会阻塞子同步块或者方法入口处,进入阻塞状态.
如果有不对,请指出,谢谢了…