Java面试官最爱问的volatile关键字

原创

Java面试官最爱问的volatile关键字

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/wo541075754/article/details/102968894

在Java的面试当中,面试官最爱问的就是volatile关键字相关的问题。经过多次面试之后,你是否思考过,为什么他们那么爱问volatile关键字相关的问题?而对于你,如果作为面试官,是否也会考虑采用volatile关键字作为切入点呢?

为什么爱问volatile关键字

爱问volatile关键字的面试官,大多数情况下都是有一定功底的,因为volatile作为切入点,往底层走可以切入Java内存模型(JMM),往并发方向走又可接切入Java并发编程,当然,再深入追究,JVM的底层操作、字节码的操作、单例都可以牵扯出来。

所以说懂的人提问题都是有门道的。那么,先整体来看看volatile关键字都设计到哪些点:内存可见性(JMM特性)、原子性(JMM特性)、禁止指令重排、线程并发、与synchronized的区别……再往深层次挖,可能就涉及到字节码、JVM等。

不过值得庆幸的是,如果你已经学习了微信公众号“程序新视界”JVM系列的文章,上面的知识点已经不是什么问题了,权当是复习了。那么,下面就以面试官提问的形式,在不看答案的情况下,尝试回答,看看学习效果如何。夺命连环问,开始……

面试官:说说volatile关键字的特性

被volatile修饰的共享变量,就具有了以下两点特性:

  • 保证了不同线程对该变量操作的内存可见性;
  • 禁止指令重排序;

回答的很好,点出了volatile关键字两大特性。针对该两大特性继续深入。

面试官:什么是内存可见性?能否举例说明?

该问题涉及到Java内存模型(JVM)和它的内存可见性特性,这里将前面系列《Java内存模型(JMM)详解》和《Java内存模型相关原则详解》中的部分内容整理出来回答。

先说内存模型:Java虚拟机规范试图定义一种Java内存模型(JMM),来屏蔽掉各种硬件和操作系统的内存访问差异,让Java程序在各种平台上都能达到一致的内存访问效果

JMM

Java内存模型是通过变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值,将主内存作为传递媒介。可举例说明内存可见性的过程。

JMM

本地内存A和B有主内存中共享变量x的副本,初始值都为0。线程A执行之后把x更新为1,存放在本地内存A中。当线程A和线程B需要通信时,线程A首先会把本地内存中x=1值刷新到主内存中,主内存中的x值变为1。随后,线程B到主内存中去读取更新后的x值,线程B的本地内存的x值也变为了1。

最后再说可见性:可见性是指当一个线程修改了共享变量的值,其他线程能够立即得知这个修改

无论普通变量还是volatile变量都是如此,只不过volatile变量保证新值能够立马同步到主内存,使用时也立即从主内存刷新,保证了多线程操作时变量的可见性。而普通变量不能够保证。

面试官:提到JMM和可见性,能说说JMM的其他特性吗

我们知道JMM除了可见性,还有原子性和有序性。

原子性即一个操作或一系列是不可中断的。即使是在多个线程的情况下,操作一旦开始,就不会被其他线程干扰。

比如,对于一个静态变量int x两条线程同时对其赋值,线程A赋值为1,而线程B赋值为2,不管线程如何运行,最终x的值要么是1,要么是2,线程A和线程B间的操作是没有干扰的,这就是原子性操作,不可被中断的。

在Java内存模型中有序性可归纳为这样一句话:如果在本线程内观察,所有操作都是有序的,如果在一个线程中观察另一个线程,所有操作都是无序的。

有序性是指对于单线程的执行代码,执行是按顺序依次进行的。但在多线程环境中,则可能出现乱序现象,因为在编译过程会出现“指令重排”,重排后的指令与原指令的顺序未必一致。

因此,上面归纳的前半句指的是线程内保证串行语义执行,后半句则指指“令重排现”象和“工作内存与主内存同步延迟”现象。

面试官:你多次提到指令重排,能举例说明吗?

CPU和编译器为了提升程序执行的效率,会按照一定的规则允许进行指令优化。但代码逻辑之间是存在一定的先后顺序,并发执行时按照不同的执行逻辑会得到不同的结果。

举个例说明多线程中可能出现的重排现象:

class ReOrderDemo {
    int a = 0;
    boolean flag = false;
public void write() {
    a = 1;                   //1
    flag = true;             //2
}
 
public void read() {
    if (flag) {                //3
        int i =  a * a;        //4
        ……
    }
}

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在上面的代码中,单线程执行时,read方法能够获得flag的值进行判断,获得预期结果。但在多线程的情况下就可能出现不同的结果。比如,当线程A进行write操作时,由于指令重排,write方法中的代码执行顺序可能会变成下面这样:

flag = true;             //2
a = 1;                   //1

 
 
  • 1
  • 2

也就是说可能会先对flag赋值,然后再对a赋值。这在单线程中并不影响最终输出的结果。

但如果与此同时,B线程在调用read方法,那么就有可能出现flag为true但a还是0,这时进入第4步操作的结果就为0,而不是预期的1了。

而volatile关键词修饰的变量,会禁止指令重排的操作,从而在一定程度上避免了多线程中的问题。

面试官:volatile能保证原子性吗?

volatile保证了可见性和有序性(禁止指令重排),那么能否保证原子性呢?

volatile不能保证原子性,它只是对单个volatile变量的读/写具有原子性,但是对于类似i 这样的复合操作就无法保证了。

如下代码,从直观上来讲,感觉输出结果为10000,但实际上并不能保证,就是因为inc 操作属于复合操作。

public class Test {
    public volatile int inc = 0;
public void increase() {
    inc  ;
}

public static void main(String[] args) {
    final Test test = new Test();
    for(int i=0;i<10;i  ){
        new Thread(){
            public void run() {
                for(int j=0;j<1000;j  )
                    test.increase();
            };
        }.start();
    }

    while(Thread.activeCount()>1)  //保证前面的线程都执行完
        Thread.yield();
    System.out.println(test.inc);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

假设线程A,读取了inc的值为10,然被阻塞,因未对变量进行修改,未触发volatile规则。线程B此时也读取inc的值,主存里inc的值依旧为10,做自增,然后立刻写回主存,值为11。此时线程A执行,由于工作内存里保存的是10,所以继续做自增,再写回主存,11又被写了一遍。所以虽然两个线程执行了两次increase(),结果却只加了一次。

有人说,volatile不是会使缓存行无效的吗?但是这里线程A读取之后并没有修改inc值,线程B读取时依旧是10。又有人说,线程B将11写回主存,不会把线程A的缓存行设为无效吗?只有在做读取操作时,发现自己缓存行无效,才会去读主存的值,而线程A的读取操作在线程B写入之前已经做过了,所以这里线程A只能继续做自增了。

针对这种情况,只能使用synchronized、Lock或并发包下的atomic的原子操作类。

面试官:刚提到synchronized,能说说它们之间的区别吗

  • volatile本质是在告诉JVM当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
  • volatile仅能使用在变量级别;synchronized则可以使用在变量、方法和类级别的;
  • volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性;
  • volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
  • volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。

面试官:还能举出其他例子说明volatile的作用吗

可举单例模式的实现,典型的双重检查锁定(DCL):

class Singleton{
    private volatile static Singleton instance = null;
private Singleton() {}

public static Singleton getInstance() {
    if(instance==null) { // 1
        synchronized (Singleton.class) {
            if(instance==null)
                instance = new Singleton(); // 2
        }
    }
    return instance;
}

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

这是一种懒汉的单例模式,使用时才创建对象,而且为了避免初始化操作的指令重排序,给instance加上了volatile。

为什么用了synchronized还要用volatile?具体来说就是synchronized虽然保证了原子性,但却没有保证指令重排序的正确性,会出现A线程执行初始化,但可能因为构造函数里面的操作太多了,所以A线程的instance实例还没有造出来,但已经被赋值了(即代码中2操作,先分配内存空间后构建对象)。

而B线程这时过来了(代码1操作,发现instance不为null),错以为instance已经被实例化出来,一用才发现instance尚未被初始化。要知道我们的线程虽然可以保证原子性,但程序可能是在多核CPU上执行。

小结

当然,针对volatile关键字还有其他方面的拓展,比如讲到JMM时可拓展到JMM与Java内存模型的区别,讲到原子性时可扩展到如何查看class字节码,讲到并发可扩展到线程并发的方法面面。

其实,不仅面试如此,在学习知识时也可以参考这种面试思维,多问几个为什么。将一个点,通过为什么拓展成一个知识网。

原文链接:《Java面试官最爱问的volatile关键字

《面试官》系列文章:


程序新视界

关注程序员的职场生涯,大量优质学习资源、技术文章分享

程序新视界-微信公众号

                                </div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-526ced5128.css" rel="stylesheet">
                </div>
</article>
<div class="postTime"> 
    <div class="article-bar-bottom">
        <span class="time">
            文章最后发布于: 2019-11-08 10:49:37            </span>
    </div>
</div>
        <div class="hide-article-box hide-article-pos text-center">
        <a class="btn-readmore" data-report-view="{&quot;mod&quot;:&quot;popu_376&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/wo541075754/article/details/102968894&quot;,&quot;strategy&quot;:&quot;readmore&quot;}" data-report-click="{&quot;mod&quot;:&quot;popu_376&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/wo541075754/article/details/102968894&quot;,&quot;strategy&quot;:&quot;readmore&quot;}">
            展开阅读全文
            <svg class="icon chevrondown" aria-hidden="true">
                <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#csdnc-chevrondown"></use>
            </svg>
        </a>
    </div>
            <!--打赏开始-->
                        <div class="reward-user-box">
                <span class="reward-word" style="color:#B4B4B4 !important">有 <span class="num">0</span> 个人打赏</span>
                                </div>
                    <!--打赏结束-->
        <div class="recommend-box"><div class="recommend-item-box type_blog clearfix" data-report-view="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qsx741olm/article/details/101144580&quot;,&quot;strategy&quot;:&quot;OPENSEARCH&quot;,&quot;index&quot;:&quot;0&quot;}" data-report-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qsx741olm/article/details/101144580&quot;,&quot;strategy&quot;:&quot;OPENSEARCH&quot;,&quot;index&quot;:&quot;0&quot;}">
<div class="content" style="width: 962px;">
	<a href="https://blog.csdn.net/qsx741olm/article/details/101144580" target="_blank" rel="noopener" title="Java面试官最爱的volatile关键字">
	<h4 class="text-truncate oneline" style="width: 802px;">
			<em>Java</em><em>面试官</em><em>最爱</em>的<em>volatile</em><em>关键字</em>		</h4>
	<div class="info-box d-flex align-content-center">
		<p class="date-and-readNum oneline">
			<span class="date hover-show">09-22</span>
			<span class="read-num hover-hide">
				阅读数 
				6</span>
			</p>
		</div>
	</a>
	<p class="content" style="width: 962px;">
		<a href="https://blog.csdn.net/qsx741olm/article/details/101144580" target="_blank" rel="noopener" title="Java面试官最爱的volatile关键字">
			<span class="desc oneline">在Java相关的岗位面试中,很多面试官都喜欢考察面试者对Java并发的了解程度,而以volatile关键字作为一个小的切入点,往往可以一问到底,把Java内存模型(JMM),Java并发编程的一些特性...</span>
		</a>
		<span class="blog_title_box oneline ">
								<span class="type-show type-show-blog type-show-after">博文</span>
										<a target="_blank" rel="noopener" href="https://blog.csdn.net/qsx741olm">来自:	<span class="blog_title"> 香草天空Sky的博客</span></a>
											</span>
	</p>
</div>
</div>
还能输入1000个字符
<div class="comment-list-container">
	<a id="comments"></a>
	<div class="comment-list-box" style="max-height: 231px;"><ul class="comment-list"><li class="comment-line-box d-flex" data-commentid="10894805" data-replyname="weixin_43916659">      <a target="_blank" href="https://me.csdn.net/weixin_43916659"><img src="https://profile.csdnimg.cn/9/C/F/3_weixin_43916659" username="weixin_43916659" alt="weixin_43916659" class="avatar"></a>        <div class="right-box ">          <div class="new-info-box clearfix">            <a target="_blank" href="https://me.csdn.net/weixin_43916659"><span class="name ">weixin_43916659</span></a><span class="date" title="2019-11-10 20:36:24">3小时前</span><span class="floor-num">#5楼</span><span class="new-comment">很强</span><span class="new-opt-box"><a class="btn btn-link-blue btn-report" data-type="report">举报</a><a class="btn btn-link-blue btn-reply" data-type="reply">回复</a><a class="btn btn-link-blue btn-read-reply" data-type="readreply">查看回复(1)</a></span></div><div class="comment-like " data-commentid="10894805"><svg t="1569296798904" class="icon " viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5522" width="200" height="200"><path d="M726.016 906.666667h-348.586667a118.016 118.016 0 0 1-116.992-107.904l-29.013333-362.666667A117.589333 117.589333 0 0 1 348.458667 309.333333H384c126.549333 0 160-104.661333 160-160 0-51.413333 39.296-88.704 93.397333-88.704 36.906667 0 71.68 18.389333 92.928 49.194667 26.88 39.04 43.178667 111.658667 12.714667 199.509333h95.530667a117.418667 117.418667 0 0 1 115.797333 136.106667l-49.28 308.522667a180.608 180.608 0 0 1-179.072 152.704zM348.458667 373.333333l-4.48 0.170667a53.461333 53.461333 0 0 0-48.768 57.472l29.013333 362.666667c2.218667 27.52 25.6 49.024 53.205333 49.024h348.544a116.949333 116.949333 0 0 0 115.925334-98.816l49.322666-308.736a53.418667 53.418667 0 0 0-52.650666-61.781334h-144.085334a32 32 0 0 1-28.458666-46.634666c45.909333-89.130667 28.885333-155.434667 11.562666-180.522667a48.981333 48.981333 0 0 0-40.192-21.504c-6.912 0-29.397333 1.792-29.397333 24.704 0 111.317333-76.928 224-224 224h-35.541333zM170.624 906.666667a32.042667 32.042667 0 0 1-31.872-29.44l-42.666667-533.333334a32.042667 32.042667 0 0 1 29.354667-34.474666c17.066667-1.408 33.024 11.733333 34.432 29.354666l42.666667 533.333334a32.042667 32.042667 0 0 1-31.914667 34.56z" p-id="5523"></path></svg><span></span></div></div></li><li class="replay-box"><ul class="comment-list"><li class="comment-line-box d-flex" data-commentid="10895295" data-replyname="wo541075754">      <a target="_blank" href="https://me.csdn.net/wo541075754"><img src="https://profile.csdnimg.cn/2/7/F/3_wo541075754" username="wo541075754" alt="wo541075754" class="avatar"></a>        <div class="right-box reply-box">          <div class="new-info-box clearfix">            <a target="_blank" href="https://me.csdn.net/wo541075754"><span class="name mr-8">二师兄-公众号-程序新视界</span></a><span class="text">回复</span>  <span class="nick-name">weixin_43916659</span><span class="date" title="2019-11-10 22:31:49">1小时前</span><span class="text"></span><span class="new-comment">

大家多多支持~举报回复


  • 上一页
  • 1
  • 下一页




Java面试官最爱volatile关键字 - 刘成 - CSDN博客

11-9

Java 面试官最喜欢关键字 volatile - java580的博客 - CSDN博客

3-20

		<div class="recommend-item-box blog-expert-recommend-box" style="display: block;">
		<div class="d-flex">
			<div class="blog-expert-recommend">
				<div class="blog-expert">
					<div class="blog-expert-flexbox" data-report-view="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/wo541075754/article/details/102968894&quot;}"><div class="blog-expert-item"><div class="blog-expert-info-box"><div class="blog-expert-img-box" data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/wo541075754/article/details/102968894&quot;}"><a href="https://blog.csdn.net/qsx741olm" target="_blank"><img src="https://profile.csdnimg.cn/4/8/8/3_qsx741olm" username="qsx741olm" alt="香草天空Sky" title="香草天空Sky"></a><span data-report-click="{&quot;mod&quot;:&quot;popu_710&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/wo541075754/article/details/102968894&quot;}"><span class="blog-expert-button-follow btn-red-follow" data-name="qsx741olm" data-nick="香草天空Sky">关注</span></span></div><div class="info"><span data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/wo541075754/article/details/102968894&quot;}"><a href="https://blog.csdn.net/qsx741olm" target="_blank"><h5 class="oneline" title="香草天空Sky">香草天空Sky</h5></a></span>  <p></p><p class="article-num" title="247篇文章"> 247篇文章</p><p class="article-num" title="排名:千里之外"> 排名:千里之外</p><p></p></div></div></div><div class="blog-expert-item"><div class="blog-expert-info-box"><div class="blog-expert-img-box" data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/wo541075754/article/details/102968894&quot;}"><a href="https://blog.csdn.net/SH_ITGirl" target="_blank"><img src="https://profile.csdnimg.cn/E/1/5/3_sh_itgirl" username="SH_ITGirl" alt="SH_ITGirl" title="SH_ITGirl"></a><span data-report-click="{&quot;mod&quot;:&quot;popu_710&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/wo541075754/article/details/102968894&quot;}"><span class="blog-expert-button-follow btn-red-follow" data-name="SH_ITGirl" data-nick="SH_ITGirl">关注</span></span></div><div class="info"><span data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/wo541075754/article/details/102968894&quot;}"><a href="https://blog.csdn.net/SH_ITGirl" target="_blank"><h5 class="oneline" title="SH_ITGirl">SH_ITGirl</h5></a></span>  <p></p><p class="article-num" title="5篇文章"> 5篇文章</p><p class="article-num" title="排名:千里之外"> 排名:千里之外</p><p></p></div></div></div><div class="blog-expert-item"><div class="blog-expert-info-box"><div class="blog-expert-img-box" data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/wo541075754/article/details/102968894&quot;}"><a href="https://blog.csdn.net/cowbin2012" target="_blank"><img src="https://profile.csdnimg.cn/D/C/4/3_cowbin2012" username="cowbin2012" alt="大神,快来碗里" title="大神,快来碗里"></a><span data-report-click="{&quot;mod&quot;:&quot;popu_710&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/wo541075754/article/details/102968894&quot;}"><span class="blog-expert-button-follow btn-red-follow" data-name="cowbin2012" data-nick="大神,快来碗里">关注</span></span></div><div class="info"><span data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/wo541075754/article/details/102968894&quot;}"><a href="https://blog.csdn.net/cowbin2012" target="_blank"><h5 class="oneline" title="大神,快来碗里">大神,快来碗里</h5></a></span>  <p></p><p class="article-num" title="601篇文章"> 601篇文章</p><p class="article-num" title="排名:67"> 排名:67</p><p></p></div></div></div><div class="blog-expert-item"><div class="blog-expert-info-box"><div class="blog-expert-img-box" data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/wo541075754/article/details/102968894&quot;}"><a href="https://blog.csdn.net/zzf1860" target="_blank"><img src="https://profile.csdnimg.cn/9/A/6/3_zzf1860" username="zzf1860" alt="zzf1860" title="zzf1860"></a><span data-report-click="{&quot;mod&quot;:&quot;popu_710&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/wo541075754/article/details/102968894&quot;}"><span class="blog-expert-button-follow btn-red-follow" data-name="zzf1860" data-nick="zzf1860">关注</span></span></div><div class="info"><span data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/wo541075754/article/details/102968894&quot;}"><a href="https://blog.csdn.net/zzf1860" target="_blank"><h5 class="oneline" title="zzf1860">zzf1860</h5></a></span>  <p></p><p class="article-num" title="18篇文章"> 18篇文章</p><p class="article-num" title="排名:千里之外"> 排名:千里之外</p><p></p></div></div></div></div>
				</div>
			</div>
		</div>
	</div><div class="recommend-item-box baiduSearch recommend-box-ident" data-report-view="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_16605855/article/details/88667422&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:&quot;3&quot;}" data-report-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_16605855/article/details/88667422&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:&quot;3&quot;}" data-track-view="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_16605855/article/details/88667422&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:2,&quot;extend1&quot;:&quot;_&quot;}" data-track-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_16605855/article/details/88667422&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:2,&quot;extend1&quot;:&quot;_&quot;}" data-flg="true">                <a href="https://blog.csdn.net/qq_16605855/article/details/88667422" target="_blank">              		<h4 class="text-truncate oneline" style="width: 876px;"><em>Java</em><em>面试官</em>最喜欢<em>问</em>的<em>关键字</em>-<em>volatile</em> - 乔志勇笔记 - CSDN博客</h4>                  <div class="info-box d-flex align-content-center">                    <p>                      <span class="date">10-24</span>                    </p>                  </div>                </a>            	</div><div class="recommend-item-box baiduSearch recommend-box-ident" data-report-view="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_32563713/article/details/79334376&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:&quot;4&quot;}" data-report-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_32563713/article/details/79334376&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:&quot;4&quot;}" data-track-view="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_32563713/article/details/79334376&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:3,&quot;extend1&quot;:&quot;_&quot;}" data-track-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_32563713/article/details/79334376&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:3,&quot;extend1&quot;:&quot;_&quot;}" data-flg="true">                <a href="https://blog.csdn.net/qq_32563713/article/details/79334376" target="_blank">              		<h4 class="text-truncate oneline" style="width: 884px;"><em>Java</em><em>面试官</em><em>最爱</em>的<em>volatile</em><em>关键字</em> - zzd007的博客 - CSDN博客</h4>                  <div class="info-box d-flex align-content-center">                    <p>                      <span class="date">10-4</span>                    </p>                  </div>                </a>            	</div>
面试官最爱的并发题 - java面试笔试 - CSDN博客

10-13

面试官最爱volatile关键字 - CSDN博客

9-12

面试官最爱volatile关键字 - IT哈哈的博客 - CSDN博客

9-26

java面试 关键字 - weixin_30677475的博客 - CSDN博客

10-5

【面试】volatile有什么用? --Java基础知识 - fcvtb的..._CSDN博客

10-25

2019年9月全国程序员工资统计

09-05 阅读数 2万+

2019年9月2日,统计了某招聘网站上的所有程序员招聘信息。并汇总如下。 博文

Java 13 新特性全面解读

09-21 阅读数 1241

作者 l Hollis

本文经授权转载自Hollis(ID:hollischuang)

2017年8月,JCP执行委员会提出将Java的发布频率改为每六个月一次,新的发布周期严格遵循时间点,将在每…


博文



线程
进程中的一个执行任务…


博文



动画:用动画给面试官解释 TCP 三次握手过程

10-12 阅读数 2万+

作者 | 小鹿 来源 | 公众号:小鹿动画学编程

写在前边
TCP 三次握手过程对于面试是必考的一个,所以不但要掌握 TCP 整个握手的过程,其中有些小细节也更受到面试官的青睐。
对于…


博文



唐僧团队要裁员,你会裁谁?

10-15 阅读数 3万+

提问:

西游记取经团为了节约成本,唐太宗需要在这个团队里裁掉一名队员,该裁掉哪一位呢,为什么?

为了完成西天取经任务,组成取经团队,成员有唐僧、孙悟空、猪八戒、沙和尚、白龙马。
高层领导: 观音…


博文



只因写了一段爬虫,公司200多人被抓!

10-16 阅读数 9万+

“一个程序员写了个爬虫程序,整个公司200多人被端了。”

“不可能吧!”

刚从朋友听到这个消息的时候,我有点不太相信,做为一名程序员来讲,谁还没有写过几段爬虫呢?只因写爬虫程序就被端有点夸张了吧。…


博文



动画:用动画给女朋友讲解 TCP 四次分手过程

10-21 阅读数 2万+

作者 | 小鹿 来源 | 公众号:小鹿动画学编程

写在前边
大家好,我们又见面了,做为一个业余的动画师,上次的用动画的形式讲解 TCP 三次握手过程再各大平台收到了广大读者的喜爱,说文章有趣、有…


博文



Linux/C/C++ 不可错过的好书

10-24 阅读数 4161

来源:公众号【编程珠玑】

作者:守望先生

ID:shouwangxiansheng

前言

经常有读者让我推荐书籍,这次我就把我私藏的计算机书单分享给你们!不过由于时间匆忙,不会进行更加详细…


博文



从月薪3K的中专生,到身家千万的CTO!人生最大的对手,就是自已

10-25 阅读数 1万+

关注“技术领导力”博客,独家大厂干货推送

文/Daniel.W

David坐在我对面,窗外是梦境般的外滩夜景,繁星点点的璀璨灯火,散落在黄浦江两岸。我转过头对David说,你丫挺会享受啊,约我…


博文



这应该是把计算机网络五层模型讲的最好是文章了,看不懂你打我

10-25 阅读数 1万+

帅地:用心写好每一篇文章!

前言
天各一方的两台计算机是如何通信的呢?在成千上万的计算机中,为什么一台计算机能够准确着寻找到另外一台计算机,并且把数据发送给它呢?
可能很多人都听说过网络通信的 5 …


博文



单点登录(SSO)

10-26 阅读数 1万+

一、SSO(单点登录)介绍

SSO英文全称Single SignOn,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用…


博文



漫话:什么是 https ?这应该是全网把 https 讲的最好的一篇文章了

10-26 阅读数 1万+

今天这篇文章,讲通过对话的形式,让你由浅入深着知道,为什么 Https 是安全的。

一、对称加密

一禅:在每次发送真实数据之前,服务器先生成一把密钥,然后先把密钥传输给客户端。之后服务器给客…


博文



史上最全的mysql基础教程

10-28 阅读数 3673

启动与停止

启动mysql服务
sudo /usr/local/mysql/support-files/mysql.server start
停止mysql服务
sudo /usr/loc…


博文



2019双十一淘宝天猫刷喵币

10-28 阅读数 1万+

实现步骤

下载并安装Auto.js
官网网址:https://hyb1996.github.io/AutoJs-Docs
Github地址:https://github.com/hyb1996/Au…


博文



敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自…


博文



一文搞懂什么是TCP/IP协议

10-28 阅读数 1万+

什么是TCP/IP协议?

计算机与网络设备之间如果要相互通信,双方就必须基于相同的方法.比如如何探测到通信目标.由哪一边先发起通信,使用哪种语言进行通信,怎样结束通信等规则都需要事先确定.不同的硬件…


博文



各大公司在GitHub上开源投入排名分析

11-05 阅读数 2120

基于GitHub的数据进行分析各个公司在开源上的投入排名 博文

中国麻将:世界上最早的区块链项目

10-29 阅读数 2万+

中国麻将:世界上最早的区块链项目

最近区块链这个玩意又被市场搞的很是火热,相信大部分人都不太清楚这玩意到底是怎么样的一个概念,它来了,它来了,它到底是啥~ 国家都开始发文支持了,下面是一个通俗易懂的…


博文



比特币原理详解

10-29 阅读数 7296

一、什么是比特币

比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是…


博文



Python 基础(一):入门必备知识

10-30 阅读数 1万+

Python 入门必备知识,你都掌握了吗? 博文

Spring简介、框架核心、优缺点、应用场景

10-29 阅读数 2649

文章目录Spring简介Spring的设计目标Spring的优缺点优点缺点Spring的应用场景 Spring简介

Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是…


博文



                <div class="recommend-item-box type_hot_word">
                                    <div class="content clearfix" style="width: 962px;">
                    <div class="float-left">
                                            <span>
                        <a href="https://www.csdn.net/gather_14/MtTaEg0sNC1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                        c# 单例模式里面的属性</a>
                    </span>
                                            <span>
                        <a href="https://www.csdn.net/gather_1f/MtTaEg0sNS1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                        c# lic文件</a>
                    </span>
                                            <span>
                        <a href="https://www.csdn.net/gather_18/MtTaEg0sNi1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                        c# 盘古分词</a>
                    </span>
                                            <span>
                        <a href="https://www.csdn.net/gather_1a/MtTaEg0sNy1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                        c# 文本框只能输入-</a>
                    </span>
                                            <span>
                        <a href="https://www.csdn.net/gather_1d/MtTaEg0sOC1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                        c# 十进制数字转换字母</a>
                    </span>
                                            <span>
                        <a href="https://www.csdn.net/gather_10/MtTaEg0sOS1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                        c#某个变量更改刷新</a>
                    </span>
                                            <span>
                        <a href="https://www.csdn.net/gather_12/MtTaEg1sMC1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                        c#往json里添加数据</a>
                    </span>
                                            <span>
                        <a href="https://www.csdn.net/gather_1f/MtTaEg1sMS1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                        c# 创建原子变量</a>
                    </span>
                                            <span>
                        <a href="https://www.csdn.net/gather_14/MtTaEg1sMi1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                        c#怎么调用api接口</a>
                    </span>
                                            <span>
                        <a href="https://www.csdn.net/gather_15/MtTaEg1sMy1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                        c# 调用mstsc</a>
                    </span>
                                            </div>
                </div>
                                    </div>
                                <div class="recommend-loading-box">
                <img src="https://csdnimg.cn/release/phoenix/images/feedLoading.gif">
            </div>
            <div class="recommend-end-box">
                <p class="text-center">没有更多推荐了,<a href="https://blog.csdn.net/" class="c-blue c-blue-hover c-blue-focus">返回首页</a></p>
            </div>
        </div>
                        <div class="template-box">
                <span>©️2019 CSDN</span><span class="point"></span>
            <span>皮肤主题: 编程工作室</span>
            <span> 设计师:
                                        CSDN官方博客                                    </span>
            </div>
                </main>
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值