0 0

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
  • 大小: 106.6 KB

4个答案 按时间排序 按投票排序

0 0

第一个问题没明白神马意思,神马叫做内部状态?

第二个问题,应该是JVM的优化导致的

对于while语句:一开始ready是false,
while(!ready){
Thread.yield();
}

虚拟机优化成代码:

if(!ready) {
   while(true){
     Thread.yield();
   }
}

发现对ready值判断一次,后面在怎么弄也没判断了。


所以应该对ready加上volatile,告诉JVM,你不要给我优化,我要用多线程的。

2013年2月08日 12:30
0 0
0 0

实际上在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
0 0

一个变量申明volatile,代表这个变量直接分配在主存(即内存),所有线程读这个变量都是去主存里面去取,这样能保证所有线程去取这个变量的时候都要去主存取,所以取到的都是一份,都是最新的,因为只有一份。
而没有申明volatile的变量可能会存在多份,因为我们目前的机器除了内存外还有cpu的一级缓存二级缓存,这样可能这个变量除了主存中有一份外缓存中也有,这样一个线程改了主存的,其他线程没有跟主存同步,那就看不到主存的修改,也就是不保证可见性了。synchronized,lock,volatile这些并发关键字确保可见性,就是因为每次执行看到这个的时候会同步主存。
第二个问题,那个程序可能会死循环,但是不是必然的,A线程如果每次看到的ready都是在缓存中拿的,不是去主存中拿的,那就看不到主线程的修改,这种情况下会死循环。

2013年2月04日 17:32

相关推荐

    Java并发编程实践(Java Concurrency in Practice) (中英版)

    2. **同步机制**:详细阐述了Java中的同步工具,如synchronized关键字、volatile变量、java.util.concurrent包下的锁、条件变量和原子变量类。这部分还深入解析了死锁、活锁和饥饿现象,以及如何避免它们。 3. **...

    Java Concurrency in Practice.zip

    《Java Concurrency in Practice》是Java并发编程领域的一本经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和Doug Lea等专家共同编写。这本书深入探讨了Java平台上的多线程和并发编程,旨在...

    Java Concurrency In Practice Learning Note

    本笔记将深入探讨《Java Concurrency In Practice》这本书中的核心概念,结合Guava库的实际使用案例,帮助读者理解并掌握Java并发编程的精髓。 首先,我们来了解Java并发的基础知识。Java提供了丰富的并发工具类,...

    Concurrent_Programming+Java Concurrency in Practice+langspec

    首先,"Java Concurrency in Practice"是Java并发编程的经典之作,由Brian Goetz、Tim Peierls、Joshua Bloch、David Holmes和Doug Lea合著。这本书提供了一套实用的指导原则、设计模式和最佳实践,帮助Java开发者...

    Java Concurrency In Practice.pdf

    《Java Concurrency In Practice》是一本关于Java并发编程的经典著作,由Brian Göetz、Tim Peierls、Joshua Bloch、Joseph Bowbeer、David Holmes和Doug Lea共同编写。本书深入探讨了Java平台上的多线程编程技巧,...

    Java Concurrency in Practice

    《Java Concurrency in Practice》详细介绍了这些问题,并提供了实用的解决方案。 书中的知识点涵盖了以下几个主要方面: 1. **并发基础**:书中首先介绍了基本的并发概念,如线程、进程、同步以及Java中的Thread...

    Java Concurrency in Practice CHM版本

    《Java Concurrency in Practice》是由Java并发库的主要开发者Doug Lea撰写的一本经典书籍,它深入探讨了Java编程中的多线程和并发编程技术。这本书是Java开发者掌握并发编程必备的参考文献,对于理解如何在Java环境...

    《Java Concurrency in Practice》源码

    通过对《Java Concurrency in Practice》的源码进行学习和分析,我们可以深入理解Java并发编程的核心原理,提升在实际项目中处理并发问题的能力。同时,这也有助于我们更好地利用Java提供的并发工具和框架,编写出...

    Java Concurrency in Practice Java并发编程

    《Java Concurrency in Practice》是Java并发编程领域的一本权威著作,由Brian Goetz、Tim Peierls、Joshua Bloch、David Holmes和Doug Lea等多位Java并发领域的专家共同编写。这本书深入探讨了Java平台上的多线程和...

    3_Java_Concurrency_in_Practice_proglib_java_practice_

    《Java并发编程实践》是Java并发领域的经典之作,由Joshua Bloch等多位专家共同撰写。这本书深入浅出地探讨了在Java环境中如何有效地编写并发程序,涵盖了从基础概念到高级策略的广泛主题,旨在帮助开发者避免并发...

    java concurrency in practice.rar

    《Java并发编程实践》是Java并发编程领域的一本经典著作,深入探讨了如何在多线程环境下编写高效、可靠的代码。这本书由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等多位Java并发领域的...

    Java Concurrency in Practice-2006版

    Java并发编程主要面临的挑战包括线程安全问题、死锁、线程饥饿和资源竞争等问题。Java语言提供了丰富的并发控制工具,比如synchronized关键字、volatile关键字、重入锁(ReentrantLock)、原子变量、读写锁...

    Addison.Wesley.Java.Concurrency.in.Practice.May.2006

    《Java并发实践》是Addison-Wesley在2006年5月出版的一本经典书籍,由Brian Goetz、Tim Peierls、Joshua Bloch、David Holmes和Doug Lea合著,全面深入地探讨了Java编程中的多线程和并发问题。这本书是Java并发领域...

    java_concurrency_in_practice:《Java并发编程实战》学习Demo

    《Java并发编程实战》是Java开发者必读的经典书籍之一,主要涵盖了Java平台上的...这个压缩包文件"java_concurrency_in_practice-master"很可能包含了这些概念的示例代码,可以帮助读者更深入地理解和实践并发编程。

Global site tag (gtag.js) - Google Analytics