网站程序 制作,wordpress本地环境迁移步骤,ccyycom服务器,飞机查询网站开发的创新点文章底部有个人公众号#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享#xff1f; 踩过的坑没必要让别人在再踩#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官#xff1a;如果不使用synchronized… 文章底部有个人公众号热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享 踩过的坑没必要让别人在再踩自己复盘也能加深记忆。利己利人、所谓双赢。 面试官如果不使用synchronized和Lock如何保证线程安全
参考答案
1、volatile
volatile关键字为域变量的访问提供了一种免锁机制使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新因此每次使用该域就要重新计算而不是使用寄存器中的值。需要注意的是volatile不会提供任何原子操作它也不能用来修饰final类型的变量。
2、原子变量
在java的util.concurrent.atomic包中提供了创建了原子类型变量的工具类使用该类可以简化线程同步。例如AtomicInteger 表可以用原子方式更新int的值可用在应用程序中如以原子方式增加的计数器但不能用于替换Integer。可扩展Number允许那些处理机遇数字类的工具和实用工具进行统一访问。
3、本地存储
可以通过ThreadLocal类来实现线程本地存储的功能。每一个线程的Thread对象中都有一个ThreadLocalMap对象这个对象存储了一组以ThreadLocal.threadLocalHashCode为键以本地线程变量为值的K-V值对ThreadLocal对象就是当前线程的ThreadLocalMap的访问入口每一个ThreadLocal对象都包含了一个独一无二的threadLocalHashCode值使用这个值就可以在线程K-V值对中找回对应的本地线程变量。
4、不可变的
只要一个不可变的对象被正确地构建出来那其外部的可见状态永远都不会改变永远都不会看到它在多个线程之中处于不一致的状态“不可变”带来的安全性是最直接、最纯粹的。Java语言中如果多线程共享的数据是一个基本数据类型那么只要在定义时使用final关键字修饰它就可以保证它是不可变的。如果共享数据是一个对象由于Java语言目前暂时还没有提供值类型的支持那就需要对象自行保证其行为不会对其状态产生任何影响才行。String类是一个典型的不可变类可以参考它设计一个不可变类。