优秀网站设计欣赏国内,做网站需要先申请域名,青岛网站设计公司排名,雄安智能网站建设方案目录
1、Java 中能创建 volatile 数组吗#xff1f;
2、volatile 能使得一个非原子操作变成原子操作吗#xff1f;
3、volatile 修饰符的有过什么实践#xff1f;
4、volatile 类型变量提供什么保证#xff1f;
5、10 个线程和 2 个线程的同步代码#xff0c;哪个更容…目录
1、Java 中能创建 volatile 数组吗
2、volatile 能使得一个非原子操作变成原子操作吗
3、volatile 修饰符的有过什么实践
4、volatile 类型变量提供什么保证
5、10 个线程和 2 个线程的同步代码哪个更容易写
6、你是如何调用 wait方法的使用 if 块还是循环为什么
7、什么是多线程环境下的伪共享false sharing
8、什么是 Busy spin我们为什么要使用它 9、Java 中怎么获取一份线程 dump 文件
10、Swing 是线程安全的
11、什么是线程局部变量
12、用 wait-notify 写一段代码来解决生产者-消费者问题
13、用 Java 写一个线程安全的单例模式Singleton
14、Java 中 sleep 方法和 wait 方法的区别 1、Java 中能创建 volatile 数组吗 能Java 中可以创建 volatile 类型数组不过只是一个指向数组的引用而不是整个数组。我的意思是如果改变引用指向的数组将会受到 volatile 的保护但是如果多个线程同时改变数组的元素volatile 标示符就不能起到之前的保护作用了。 2、volatile 能使得一个非原子操作变成原子操作吗 一个典型的例子是在类中有一个 long 类型的成员变量。如果你知道该成员变量会被多个线程访问如计数器、价格等你最好是将其设置为 volatile。为什么因为 Java 中读取 long 类型变量不是原子的需要分成两步如果一个线程正在修改该 long 变量的值另一个线程可能只能看到该值的一半前 32 位。但是对一个 volatile 型的 long 或 double 变量的读写是原子。 3、volatile 修饰符的有过什么实践 一种实践是用 volatile 修饰 long 和 double 变量使其能按原子类型来读写。double 和 long 都是 64 位宽因此对这两种类型的读是分为两部分的第一次读取第一个 32 位然后再读剩下的 32 位这个过程不是原子的但 Java 中volatile 型的 long 或 double 变量的读写是原子的。volatile 修复符的另一个作用是提供内存屏障memory barrier例如在分布式框架中的应用。简单的说就是当你写一个 volatile 变量之前Java 内存模型会插入一个写屏障write barrier读一个 volatile 变量之前会插入一个读屏障read barrier。意思就是说在你写一个 volatile 域时能保证任何线程都能看到你写的值同时在写之前也能保证任何数值的更新对所有线程是可见的因为内存屏障会将其他所有写的值更新到缓存。 4、volatile 类型变量提供什么保证 volatile 变量提供顺序和可见性保证例如JVM 或者 JIT 为了获得更好的性能会对语句重排序但是 volatile 类型变量即使在没有同步块的情况下赋值也不会与其他语句重排序。 volatile 提供 happens-before 的保证确保一个线程的修改能对其他线程是可见的。某些情况下volatile 还能提供原子性如读 64 位数据类型像 long 和 double 都不是原子的但 volatile 类型的 double 和long 就是原子的。 5、10 个线程和 2 个线程的同步代码哪个更容易写 从写代码的角度来说两者的复杂度是相同的因为同步代码与线程数量是相互独立的。但是同步策略的选择依赖于线程的数量因为越多的线程意味着更大的竞争所以你需要利用同步技术如锁分离这要求更复杂的代码和专业知识。 6、你是如何调用 wait方法的使用 if 块还是循环为什么
wait() 方法应该在循环调用因为当线程获取到 CPU 开始执行的时候其他条件可能还没有满足所以在处理前循环检测条件是否满足会更好。下面是一段标准的使用 wait 和 notify 方法的代码
// The standard idiom for using the wait method
synchronized (obj) {
while (condition does not hold)
obj.wait(); // (Releases lock, and reacquires on wakeup)
... // Perform action appropriate to condition
} 7、什么是多线程环境下的伪共享false sharing 伪共享是多线程系统每个处理器有自己的局部缓存中一个众所周知的性能问题。伪共享发生在不同处理器的上的线程对变量的修改依赖于相同的缓存行伪共享问题很难被发现因为线程可能访问完全不同的全局变量内存中却碰巧在很相近的位置上。如其他诸多的并发问题避免伪共享的最基本方式是仔细审查代码根据缓存行来调整你的数据结构。 8、什么是 Busy spin我们为什么要使用它
Busy spin 是一种在不释放 CPU 的基础上等待事件的技术。它经常用于避免丢失 CPU 缓存中的数据如果线程先暂停之后在其他 CPU 上运行就会丢失。所以如果你的工作要求低延迟并且你的线程目前没有任何顺序这样你就可以通过循环检测队列中的新消息来代替调用 sleep() 或 wait() 方法。它唯一的好处就是你只需等待很短的时间如几微秒或几纳秒。LMAX 分布式框架是一个高性能线程间通信的库该库有一个 BusySpinWaitStrategy 类就是基于这个概念实现的使用 busy spin 循环 EventProcessors 等待屏障 9、Java 中怎么获取一份线程 dump 文件
在 Linux 下你可以通过命令 kill -3 PID Java 进程的进程 ID来获取 Java应用的 dump 文件。在 Windows 下你可以按下 Ctrl Break 来获取。这样 JVM 就会将线程的 dump 文件打印到标准输出或错误文件中它可能打印在控制台或者日志文件中具体位置依赖应用的配置。如果你使用 Tomcat。 10、Swing 是线程安全的
不是Swing 不是线程安全的。你不能通过任何线程来更新 Swing 组件如JTable、JList 或 JPanel事实上它们只能通过 GUI 或 AWT 线程来更新。这就是为什么 Swing 提供 invokeAndWait() 和 invokeLater() 方法来获取其他线程的 GUI 更新请求。这些方法将更新请求放入 AWT 的线程队列中可以一直等待也可以通过异步更新直接返回结果。你也可以在参考答案中查看和学习到更详细的内容。 11、什么是线程局部变量
线程局部变量是局限于线程内部的变量属于线程自身所有不在多个线程间共享。Java 提供 ThreadLocal 类来支持线程局部变量是一种实现线程安全的方式。但是在管理环境下如 web 服务器使用线程局部变量的时候要特别小心在这种情况下工作线程的生命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释放Java 应用就存在内存泄露的风险。 12、用 wait-notify 写一段代码来解决生产者-消费者问题
http://java67.blogspot.sg/2012/12/producer-consumer-problem-with-wait-and-notify-example.html
请参考答案中的示例代码。只要记住在同步块中调用 wait() 和 notify()方法如果阻塞通过循环来测试等待条件。 13、用 Java 写一个线程安全的单例模式Singleton
http://javarevisited.blogspot.in/2012/12/how-to-create-thread-safe-singleton-in-java-example.html
请参考答案中的示例代码这里面一步一步教你创建一个线程安全的 Java 单例类。当我们说线程安全时意思是即使初始化是在多线程环境中仍然能保证单个实例。Java 中使用枚举作为单例类是最简单的方式来创建线程安全单例模式的方式。 14、Java 中 sleep 方法和 wait 方法的区别
虽然两者都是用来暂停当前运行的线程但是 sleep() 实际上只是短暂停顿因为它不会释放锁而 wait() 意味着条件等待这就是为什么该方法要释放锁因为只有这样其他等待的线程才能在满足条件时获取到该锁。 要想了解更多
千题千解·Java面试宝典_时光の尘的博客-CSDN博客