-
volatile有关的问题;java concurrency in practice10
问题1:
java concurrency in practice中:
“线程A向volatile变量(设为aa)写入值”,这里线程A修改变量aa的内部状态值,还会有后面的效果吗?
问题2:
下面这段代码咋运行可以看到一直循环运行的结果?jvm参数加了-server也木有用。
public class TestVolatile {
private static boolean ready;
private static int number;
private static class A extends Thread{
public void run(){
while(!ready){
Thread.yield();
}
System.out.println(number);
}
}
public static void main(String... args){
new A().start();
number = 42;
ready = true;
}
}
2013年2月04日 17:04
4个答案 按时间排序 按投票排序
-
第一个问题没明白神马意思,神马叫做内部状态?
第二个问题,应该是JVM的优化导致的
对于while语句:一开始ready是false,
while(!ready){
Thread.yield();
}
虚拟机优化成代码:
if(!ready) {
while(true){
Thread.yield();
}
}
发现对ready值判断一次,后面在怎么弄也没判断了。
所以应该对ready加上volatile,告诉JVM,你不要给我优化,我要用多线程的。2013年2月08日 12:30
-
实际上在java中为了实现跨平台,有一个java内存模型概念,它是模拟cpu的效果来完成各种运算(因为不同型号的机型的指令集是有区别的,而java又必须依赖于底层系统)。对于volatile,楼上已经说的很清楚了,但是volatile并不是一定能保证同步,因为它涉及到jvm的堆和栈的操作,他只能在一定的条件下是变量对各个线程都可见,每个线程在使用之前去主存中去刷新,但并不能保证当一个线程刷新过后,立即有另外一个线程把变量的值改变了,那么刚才的线程拿到的值就是不一致的。
你的代码这样写是不能实现无限循环的,在我看来这只是一个内部类的写法,内部类可以使用外部类的变量。
如果你想一直循环,可以这样写:
package test;
public class TestVolatile {
private static boolean ready=false;
private static int number;
private static class A extends Thread {
private boolean ready =false;
public void run() {
while (!ready) {
System.out.println(number);
Thread.yield();
}
}
}
public static void main(String... args) {
new A().start();
number = 42;
ready = true;
}
}
这样一直都不会听,可能会导致内存溢出。2013年2月05日 09:34
-
一个变量申明volatile,代表这个变量直接分配在主存(即内存),所有线程读这个变量都是去主存里面去取,这样能保证所有线程去取这个变量的时候都要去主存取,所以取到的都是一份,都是最新的,因为只有一份。
而没有申明volatile的变量可能会存在多份,因为我们目前的机器除了内存外还有cpu的一级缓存二级缓存,这样可能这个变量除了主存中有一份外缓存中也有,这样一个线程改了主存的,其他线程没有跟主存同步,那就看不到主存的修改,也就是不保证可见性了。synchronized,lock,volatile这些并发关键字确保可见性,就是因为每次执行看到这个的时候会同步主存。
第二个问题,那个程序可能会死循环,但是不是必然的,A线程如果每次看到的ready都是在缓存中拿的,不是去主存中拿的,那就看不到主线程的修改,这种情况下会死循环。2013年2月04日 17:32
相关推荐
2. **同步机制**:详细阐述了Java中的同步工具,如synchronized关键字、volatile变量、java.util.concurrent包下的锁、条件变量和原子变量类。这部分还深入解析了死锁、活锁和饥饿现象,以及如何避免它们。 3. **...
《Java Concurrency in Practice》是Java并发编程领域的一本经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和Doug Lea等专家共同编写。这本书深入探讨了Java平台上的多线程和并发编程,旨在...
本笔记将深入探讨《Java Concurrency In Practice》这本书中的核心概念,结合Guava库的实际使用案例,帮助读者理解并掌握Java并发编程的精髓。 首先,我们来了解Java并发的基础知识。Java提供了丰富的并发工具类,...
首先,"Java Concurrency in Practice"是Java并发编程的经典之作,由Brian Goetz、Tim Peierls、Joshua Bloch、David Holmes和Doug Lea合著。这本书提供了一套实用的指导原则、设计模式和最佳实践,帮助Java开发者...
《Java Concurrency In Practice》是一本关于Java并发编程的经典著作,由Brian Göetz、Tim Peierls、Joshua Bloch、Joseph Bowbeer、David Holmes和Doug Lea共同编写。本书深入探讨了Java平台上的多线程编程技巧,...
《Java Concurrency in Practice》详细介绍了这些问题,并提供了实用的解决方案。 书中的知识点涵盖了以下几个主要方面: 1. **并发基础**:书中首先介绍了基本的并发概念,如线程、进程、同步以及Java中的Thread...
《Java Concurrency in Practice》是由Java并发库的主要开发者Doug Lea撰写的一本经典书籍,它深入探讨了Java编程中的多线程和并发编程技术。这本书是Java开发者掌握并发编程必备的参考文献,对于理解如何在Java环境...
通过对《Java Concurrency in Practice》的源码进行学习和分析,我们可以深入理解Java并发编程的核心原理,提升在实际项目中处理并发问题的能力。同时,这也有助于我们更好地利用Java提供的并发工具和框架,编写出...
《Java Concurrency in Practice》是Java并发编程领域的一本权威著作,由Brian Goetz、Tim Peierls、Joshua Bloch、David Holmes和Doug Lea等多位Java并发领域的专家共同编写。这本书深入探讨了Java平台上的多线程和...
《Java并发编程实践》是Java并发领域的经典之作,由Joshua Bloch等多位专家共同撰写。这本书深入浅出地探讨了在Java环境中如何有效地编写并发程序,涵盖了从基础概念到高级策略的广泛主题,旨在帮助开发者避免并发...
《Java并发编程实践》是Java并发编程领域的一本经典著作,深入探讨了如何在多线程环境下编写高效、可靠的代码。这本书由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等多位Java并发领域的...
Java并发编程主要面临的挑战包括线程安全问题、死锁、线程饥饿和资源竞争等问题。Java语言提供了丰富的并发控制工具,比如synchronized关键字、volatile关键字、重入锁(ReentrantLock)、原子变量、读写锁...
《Java并发实践》是Addison-Wesley在2006年5月出版的一本经典书籍,由Brian Goetz、Tim Peierls、Joshua Bloch、David Holmes和Doug Lea合著,全面深入地探讨了Java编程中的多线程和并发问题。这本书是Java并发领域...
《Java并发编程实战》是Java开发者必读的经典书籍之一,主要涵盖了Java平台上的...这个压缩包文件"java_concurrency_in_practice-master"很可能包含了这些概念的示例代码,可以帮助读者更深入地理解和实践并发编程。