课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
内存模型相信大家在学习java编程开发技术的时候也应该都接触过的吧,今天我们就通过案例分析来了解一下,JMM内存模型三大特性。
原子性:一个操作或多个操作,要么全部执行并且执行过程中不会被任何因素打断,要么就不执行。
对于基本数据类型变量的原子性操作由JUC包原子类中的AtomicInteger等来实现;
对于更大范围操作的原子性,使用synchronized和Lock来实现。
可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值
volatile:当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。
synchronized和Lock:保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中,因此可以保证可见性。
final:被final关键字修饰的字段一旦初始化完成,并且没有发生this逃逸(其它线程通过this引用访问到初始化了一半的对象),也能保证对其他线程的可见性。
有序性:程序执行的顺序按照代码的先后顺序执行。
指令重排序:一般来说,处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序终执行结果和代码顺序执行的结果是一致的(顺序不一致,但结果一致)。重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。
源代码->编译器优化的重排->指令并行的重排->内存系统的重排->终执行的指令
保证有序性的方法:
volatile关键字;
通过synchronized和Lock来保证有序性,其可以保证每个时刻是有一个线程执行同步代码,相当于是让线程顺序执行同步代码,自然也就保证了有序性;
Java内存模型具备一些先天的“有序性”,即不需要通过任何手段就能够得到保证的有序性,通常称为happens-before原则。在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在happens-before关系。这两个操作既可以在一个线程之内,也可以在不同线程之间。happens-before的一些重要规则:
程序顺序规则:一个线程内,按照代码顺序,书写在前的操作线性发生于先行在后的操作;
监视器锁规则:一个unlock操作先行发生于后面对同一个锁的lock操作;
volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作;
传递性:若操作A先行发生于B,而操作B又先行发生于C,则可以得出操作A先行发生于C。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请在707945861群中学习了解。