总结了几个Java锁的面试题,看你是否能融会贯通

JAVA herman 410浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

收费群和不收费群最大的区别不在于发广告本身,而是在于花这点时间是否值得发一个广告。

昨天我和群里的几个网友在讨论问题,有人担心数学不好,是不是真的就不能学编程。这个完全不对,但是学不好数学,想往深处发展就难。数学和编程紧密挂钩,只是很多人习惯了 API 调用,感觉不到吧了。比如,进制转换,排序等都是数学知识的体现,以及数学知识的应用。这在平常我们都是通过 API 调用来实现的,你只停留在表面,所以你可能在编程中体验不到数学的存在。

面试题大全

今天,我给大家讨论几个关于 Java 锁方面的面试题,看看能不能够难住到大家!

1、现有一个方法 a,内部代码如下所示:

int a = 1;//代码1
int b = 2;//代码2
volatile int c = 3;//代码3
int d = 4;//代码4
int e = 5;//代码5

请问上面的代码会发生重排序吗?

针对这个问题,很多人回答,代码1和代码2会发生重排序,代码3不会发生重排序,代码4和代码5会发生重排序。也有人说,代码3、4、5之间也会发生重排序。其实都不对,因为这个题本身就是错的。volatile 不能用在方法代码中,volitale 是成员变量修饰符。

2、如何保证一个共享变量的可见性?

这个题方法有多种。方案一、保证共享变量的可见性,使用 volatile 关键字修饰即可。方案二、保证共享变量是 private,访问变量使用set/get 方法,使用 synchronized 对方法加锁,此种方法不仅保证了可见性,也保证了线程安全。方案三、使用原子变量,例如,AtomicInteger 等。

3、long 类型在 32 位的机器上,会不会发生线程安全问题?

会发生。因为 long 是一个 64 位的数据类型。在 32 位 CPU 上执行写操作会被拆分成两次写操作。所以,就可能发生线程安全问题。

4、下面的代码是否线程安全?

class Xttblog{
    Integer a = 0;
    String b = "b";
    public void test0(){
        synchronized(this.a){...}
    }
    public void test1(){
        synchronized(this.b){...}
    }
}

非线程安全的。不能用 a 和 b 做为锁对象。这两个对象 a 是 Integer,b 是 String 都是不可变变对象,一但对他们进行赋值就会变成新的对象,加的锁就失效了。

最近特别忙,后面干货分享继续。还有大家想看那方面的知识点,可以留言评论,后面分享。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 总结了几个Java锁的面试题,看你是否能融会贯通