Java类加载以及Java内存模型

JVM内存区域,开线程影响哪块内存?
java栈、方法区、本地方法栈

JVM内存模型,内存区域
虚拟机内存区域分为:运行时数据区+(执行引擎+本地库接口+本地方法库)
运行时数据区:方法区、Java栈、Java堆、本地方法栈、程序计数器

Java的内存模型:
Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作内存中保存了被该线程所使用到的变量(这些变量是从主内存中拷贝而来)
线程对变量的所有操作(读取,赋值)都必须在工作内存中进行.不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成.
并发编程的三大概念:原子性(处理器优化问题),有序性(指令重排问题),可见性(缓存一致性问题).
原子性:即一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行.
可见性:是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值
有序性:即程序执行的顺序按照代码的先后顺序执行.

内存模型存在的目的:
为了保证共享内存(主内存)的正确性(原子性,可见性,有序性),内存模型定义了共享内存系统中多线程程序读写操作行为规范,通过这些规则来规范对内存的读写操作,从而保证指令执行的正确性.
内存模型解决并发问题主要采取两种方式:限制处理器优化和使用内存屏障
Java内存模型的实现:使用锁以及并发包来实现的.
譬如:使用synchronized保证方法和代码块内操作的原子性;使用volatitle,synchronized,final实现可见性;volatitle,synchronized实现有序性.
volatitle,synchronized实现有序性的区别:
volatitle关键字会禁止指令重排,synchronized关键字保证同一时刻只允许一条线程操作

synchronized的原理:
1)同步方法通过ACC_SYNCHRONIZED关键字隐式的对方法进行加锁。当线程要执行的方法被标注上ACC_SYNCHRONIZED时,需要先获得锁才能执行该方法。
2)同步代码块通过monitorenter和monitorexit执行来进行加锁。当线程执行到monitorenter的时候要先获得所锁,才能执行后面的方法。当线程执行到monitorexit的时候则要释放锁。
每个对象自身维护这一个被加锁次数的计数器,当计数器数字为0时表示可以被任意线程获得锁。当计数器不为0时,只有获得锁的线程才能再次获得锁。即可重入锁

猜你喜欢

转载自blog.csdn.net/hanfengzqh/article/details/80941361