做百度推广是不是得有个网站先,delphi可以做网站吗,手机建网站免费域名空间,国家企业信息公示信息官网一.谈一下JMM
1.JMM#xff0c;JavaMemoryModel#xff0c;Java内存模型。定义了多线程对共享内存读写操作的行为规范#xff0c;通过规范多线程对共享内存的读写操作#xff0c;以保证指令执行和结果的正确性。
2.JMM把内存分为两块
#xff08;1#xff09;主内存JavaMemoryModelJava内存模型。定义了多线程对共享内存读写操作的行为规范通过规范多线程对共享内存的读写操作以保证指令执行和结果的正确性。
2.JMM把内存分为两块
1主内存是线程间共享的内存区域可以被所有线程访问存储了共享变量的原始副本。
2工作内存是线程的私有区域每个线程都有一个自己的工作内存是线程的工作区域不同线程的工作内存相互独立、相互隔离。 a.线程的工作内存相互隔离每个线程都只能访问属于自己的工作内存。 b.线程不直接操作主内存的数据而是将主内存的数据拷贝一份到自己的工作内存中进行操作操作完再将数据更新到主内存。 c.线程在自己的工作内存对主内存变量的副本进行修改后通过CAS操作将其更新到主内存的变量中其他线程再将主内存变量的最新值更新到自己的副本变量中。不同线程是通过主内存进行交互的。
3.JMM的8个原子操作
1read读取读取主内存的变量值到工作内存中
2load载入将从主内存读到的变量值放到工作内存的副本变量中
3store存储将工作内存的变量值送到主内存中
4write写入将工作内存送来的变量值写入到主内存的变量中
5use使用将工作内存的变量值传递给执行引擎以供其他指令需要
6assign赋值将从执行引擎获取到的值赋值给工作内存的变量
7lock加锁将主内存的变量标记为线程独占状态
8unlock解锁将主内存的变量的加锁状态解除
二.并发编程的三大特征是什么 / 导致并发程序出现问题的根本原因是什么
1.原子性一个操作要么全部完成要么全部都不完成不会因为上下文切换而导致结果出错。
2.可见性虽然每个线程只能操作自己工作内存的数据自己的工作内存对其他线程不可见但是当一个线程对主内存的共享变量进行更新后其他线程要能立即知道并更新为最新值。
3.有序性为了提高运行效率编译器会对代码进行重排序cpu也会对指令进行重排序这种重排序不会影响单线程的执行结果但会影响多线程并发执行的结果。因此并发编程要能保证重排序之后的有序性执行结果不会因重排序而出错。
三.JMM如何保证并发编程三大特征 / Java程序中如何保证多线程的执行安全
1.原子性synchronized、JUC中的Lock
2.可见性volatile、synchronized、JUC中的Lock
3.有序性volatile、synchronized
四.说一下volatile关键字
volatile关键字用于修饰共享变量(类的成员变量和静态成员变量)具有两种作用
1.保证并发编程的可见性
1问题1JVM提供了一个即时编译器JIT会对代码进行优化。例如while(!stop)stop默认为false。如果当前代码的执行逻辑中没有对stop进行修改则会将代码优化为while(true)这在单线程下是可行的但是在多线程中若有其他线程对stop进行更改由于代码优化会导致执行当前代码的线程无法收到其他线程对stop的更改通知失去了并发编程的可见性。
2问题2若线程在更新主内存的共享变量后其他线程未及时同步最新值则其他线程在工作内存中的变量副本就相当于失效了这也失去了并发编程的可见性。
3解决使用volatile修饰共享变量 a.使用volatile修饰的变量可以防止JIT对其进行优化 b.使用volatile修饰的变量会对其读写操作加上属于硬件层面的内存屏障 对volatile变量执行读操作前会插入即读屏障强行使当前工作内存的变量失效重新去主内存获取变量值 对volatile变量进行写操作后会插入即写屏障强行将工作内存的变量最新值更新到主内存中
2.保证并发编程的有序性
1问题编译器为了提高效率会对代码进行重排序影响了高并发下的执行结果
2解决用volatile修饰的变量会对其读写操作加上属于JMM层面的内存屏障保证重排序后的有序性。 LoadBarrier; volatile读操作; //重排序时其上所有读操作不能越过屏障排到下面其下所有写操作不能越过屏障跑到上面 StoreBarrier; ... StoreBarrier; volatile写操作; //重排序时其上所有写操作不能越过屏障排到下面其下所有读操作不能越过屏障跑到上面 LoadBarrier;