再过一个月的时间就是金三银四了,相信很多的朋友对于已经作好了充足的准备来应对这一次春招,小编对你们也没有太多的建议和帮助,分享一些大家面试上面能够用获得的一些面试题。今天主要给你们分享多线程(线程安全)方面的面试题,看到文章的小伙伴必定要看到后面哦,有海量的面试题分享给你们哟。java
线程安全 就是多线程在运行期间不会产生不符合常规的数据。程序员
一样在多线程访问同一代码,不会产生不肯定的结果面试
线程安全首先呢他的是多线程,至少是2个。由于一个线程那确定是线程安全的。就你本身一个线程执行没有人给你争用资源。你是在串行执行,不会出现不肯定结果。 若是有多个线程 那问题可就多了。好比一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:spring
1. 在 Items[Size] 的位置存放此元素;安全
2. 增大 Size 的值。微信
线程A完成第一步时,被CPU暂停了。此时Size值仍是原来的值线程B并不知情,又跑到线程A刚才放元素的位置又放了一遍,而后Size+1。紧接着A也被唤醒了,也去Size+1 这时候Size = 2了,可是只有一个元素。虽然放了两次放到了一样的位置上覆盖了。多线程
怎么解决这个问题?能够好好思考一下并发
一、把操做设置成原子操做,哥执行的时候不被别人打扰。函数
二、让修改过的值实时告知给其余线程。微服务
三、还有我继续想~
同步有两种方法 分别是synchronized wait与notify
Java内存模型就是 java内存分为主内存和工做内存。
多线程 每个线程都会有一个本身的工做内存,所使用到的变量都是主内存的一份拷贝。
Volatile 的做用就是多线程使用同一个变量时,每次都去主内存去读。保障了数据的实时性。 应用场景就是多线程 操做同一个变量。
可见性:就是一个线程修改了变量,其余线程能够当即知道
保证可见性的方法
volatile
synchronized (unlock以前,写变量值回主存)
final(一旦初始化完成,其余线程就可见)
代码重排序是为了CPU的高效率执行。
JVM指令重排的基本原则
更多技术文章和面试真题能够关注微信公众号:Java程序员汇集地。