2018-10-23volatile和synchronized及多线程面试题

1 Java中的volatile关键是什么作用?怎样使用它?在Java中它跟synchronized方法有什么不同?

自从Java 5和Java内存模型改变以后,基于volatile关键字的线程问题越来越流行。应该准备好回答关于volatile变量怎样在并发环境中确保可见性。

volatile关键字的作用是:保证变量的可见性。

在java内存结构中,每个线程都是有自己独立的内存空间(此处指的线程栈)。当需要对一个共享变量操作时,线程会将这个数据从主存空间复制到自己的独立空间内进行操作,然后在某个时刻将修改后的值刷新到主存空间。这个中间时间就会发生许多奇奇怪怪的线程安全问题了,volatile就出来了,它保证读取数据时只从主存空间读取,修改数据直接修改到主存空间中去,这样就保证了这个变量对多个操作线程的可见性了。换句话说,被volatile修饰的变量,能保证该变量的 单次读或者单次写 操作是原子的。

但是线程安全是两方面需要的 原子性(指的是多条操作)和可见性。volatile只能保证可见性,synchronized是两个均保证的。

volatile轻量级,只能修饰变量;synchronized重量级,还可修饰方法。

volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞。

2 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?

这是另一个非常经典的java多线程面试问题。这也是我刚开始写线程程序时候的困惑。现在这个问题通常在电话面试或者是在初中级Java面试的第一轮被问到。这个问题的回答应该是这样的,当你调用start()方法时你将创建新的线程,并且执行在run()方法里的代码。但是如果你直接调用run()方法,它不会创建新的线程也不会执行调用线程的代码。

3 什么是不可变对象,它对写并发应用有什么帮助?

另一个多线程经典面试问题,并不直接跟线程有关,但间接帮助很多。这个java面试问题可以变的非常棘手,如果他要求你写一个不可变对象,或者问你为什么String是不可变的。

immutable Objects(不可变对象)就是那些一旦被创建,它们的状态就不能被改变的Objects,每次对他们的改变都是产生了新的immutable的对象,而mutable Objects(可变对象)就是那些创建后,状态可以被改变的Objects.

如何在Java中写出Immutable的类?

1. immutable对象的状态在创建之后就不能发生改变,任何对它的改变都应该产生一个新的对象。

2. immutable类的所有的属性都应该是final的。

3. 对象必须被正确的创建,比如:对象引用在对象创建过程中不能泄露(leak)。

4. 对象应该是final的,以此来限制子类继承父类,以避免子类改变了父类的immutable特性。

5. 如果类中包含mutable类对象,那么返回给客户端的时候,返回该对象的一个拷贝,而不是该对象本身(该条可以归为第一条中的一个特例)

使用Immutable类的好处:

1. Immutable对象是线程安全的,可以不用被synchronize就在并发环境中共享

2.Immutable对象简化了程序开发,因为它无需使用额外的锁机制就可以在线程间共享

3. Immutable对象提高了程序的性能,因为它减少了synchroinzed的使用

4. Immutable对象是可以被重复使用的,你可以将它们缓存起来重复使用,就像字符串字面量和整型数字一样。你可以使用静态工厂方法来提供类似于valueOf()这样的方法,它可以从缓存中返回一个已经存在的Immutable对象,而不是重新创建一个。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 内容简介: 曾经有个出身门第算命之家的子弟,一心想继承祖上家业,但是祖宗定下规矩,到父亲这一代就要截止,后代不能从...
    Andy言午阅读 564评论 4 1
  • 匆匆的离别 执手相看泪眼的痛 记忆深处奇妙的缘 尘封一段情 任时光飞逝 任岁月凋零 在灵魂出窍的地方 有你我相随的...
    谷雨666阅读 191评论 0 0
  • 小米下了夜班早上八半回到家,边洗脚边刷手机。 其实这个手机她已经刷了一夜了。 夜班是晚上0点到早上8点,不允许睡觉...
    易秋寒阅读 397评论 0 1

友情链接更多精彩内容