本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
收费群和不收费群最大的区别不在于发广告本身,而是在于花这点时间是否值得发一个广告。
昨天我和群里的几个网友在讨论问题,有人担心数学不好,是不是真的就不能学编程。这个完全不对,但是学不好数学,想往深处发展就难。数学和编程紧密挂钩,只是很多人习惯了 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)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » 总结了几个Java锁的面试题,看你是否能融会贯通