43 集

面试是类似演讲演说的过程,网上的面试资料都是文字的,没办法让面试者直观的体验到面试过程,希望这个音频节目对你有帮助。
纯粹硬核IT知识,技术小白请绕路。
搜集整理各种面试官提出的技术问题。
为IT人提供专业知识的面试指导。

2020年JAVA面试208‪题‬ 小崔爱读书

    • 科技
    • 5.0 • 10 个评分

面试是类似演讲演说的过程,网上的面试资料都是文字的,没办法让面试者直观的体验到面试过程,希望这个音频节目对你有帮助。
纯粹硬核IT知识,技术小白请绕路。
搜集整理各种面试官提出的技术问题。
为IT人提供专业知识的面试指导。

    synchronized的底层原理

    synchronized的底层原理

    • 24 分钟
    多线程原子性可见性和有序性的理解之三

    多线程原子性可见性和有序性的理解之三

    • 8 分钟
    多线程原子性可见性和有序性的理解之二

    多线程原子性可见性和有序性的理解之二

    • 8 分钟
    多线程原子性可见性和有序性的理解之一

    多线程原子性可见性和有序性的理解之一

    说到多线程的原子性、可见性和有序性。
    这是多线程确保线程安全的三个标准。
    首先。咱说说。原子性。原子性其实很好理解。原子就是最小的单元,他就是可执行的最小的单元。在程序执行的时候,最小的一个可执行单元就是一个原子。
    一段原子性的代码执行的时候。不会被打断。这一段代码的执行,要么不执行,要么全部执行完毕。
    这段代码也许只有一行代码,也许是多行代码。
    一行代码很多也不是原子性的,因为这个原子性并非是我们Java程序代码的原子性,而是CPU执行 阶段的原子性。并不是说代码少他就是原子性。也不是说代码多的就不是原子性。一行代码很多都不是原子性的,多行代码加上锁,也可以是原子性的。
    比如。定义一个整型int i = 10。这一行代码它就是原子性的,这里是给整形变量i赋值,这个就是原子性的,它不可能被打断。
    如果定义的一个长整型的 long j=10,这就不是原子性的,为什么呢?因为这个long类型啊,他是64位的,64位的长整型。在CPU中执行赋值操作的时候,它是分两步,分别64位的高位和低位进行赋值,这是分两步来完成的。类似的double也是这样子,double也是64位的,会分两步分别给高32位和低32位赋值,就是两步操作,不是原子性的。
    那么咱们来看另一个语句。int i=10; i++ ; 这个i=10我们刚刚说过了,是原子性的,那这个 i++是不是原子型的呢?直接说答案:i++不是原子型的。
    别看这么简单的一个计算,写程序就一行,但到了CPU级别就需要3条指令,1 获取i的值, 2 执行i+1 的操作,3 把i+1的结果赋值给i 。所以这个i++不是原子性的。
    这么简单的语句都不是原子性的,那么是不是对于多行代码就肯定不是原子性了呢?其实也不是,Java可以利用锁来保证多行语句是原子性的。
    从CPU的角度来看,就是插入一个Lock指令。当一段代码被Lock指令锁住后,一个线程执行这段代码的时候,其他线程就无法执行,只能等着这个线程执行完毕才能获得执行权。这就是保证这段代码的原子性。
    具体在Java代码里面写的时候就用synchronized 和lock对象,来实现一段代码,一个方法,一个对象的锁。这是对原子性的解释。
    那么可见性是什么呢?在Java的内存模型中,每一个子线程会拥有一个单独的工作内存,主线程有一个主内存。主内存中存放的是共享变量,虽说是共享变量,看起来是被主线程和子线程共享的,那么子线程就可以读写操作该共享变量了吧?其实不行的,子线程是不能直接读写操作主内存中的共享变量的。
    子线程会在工作内存中创建该共享变量的副本,然后读写操作该副本。这里再强调一下,子线程不能直接读写主内存的共享变量,只能读写工作内存中的共享变量的副本,读写完毕后再将副本的值回写到主内存中。
    这时候,我们就发现一个问题了,假设主线程中有共享变量 x = 10 , 有两个子线程 A和B,要操作共享变量x,就会分别在各自的工作内存中加载一份x的副本。这时候咱们看到了,原来只有一个x,现在变成了3份:主内存中的x和两个副本x。
    如果子线程A对副本x做了+1 操作,线程A中的x就变成 11 了,但线程B看到的x还是10,这就出现了可见性的问题。
    通过上面的描述,总结一下什么是线程的可见性问题:就是多线程情况下,一个线程修改了变量的值,另一个线程看不到这个变化。
    那怎么解决这个问题呢?思路是这样的,对于线程A来说,只要修改了x副本的值,马上把这个值回写到主内存中;对于线程B来说,只要想读x的值,就再次从主线程加载

    • 4 分钟
    JAVA的内存模型

    JAVA的内存模型

    • 8 分钟
    CPU的多级缓存模型

    CPU的多级缓存模型

    • 2 分钟

用户评论

5.0(满分 5 分)
10 个评分

10 个评分

哼哼唧唧🔥

声音

声音一会大一会小

给你一个粉红的回忆

作者快更新!

快更新作者!讲的不错!!

ZcccforUcl

求更新呀!讲得很好

求更新求更新

你可能还喜欢