-
关于volatile的测试。。。0
public class TestThread { private static boolean flag = false; public static void main(String[] args) { new Thread() { int i = 0; public void run() { long tm = System.currentTimeMillis(); while (!flag) { i++; } System.out.println(System.currentTimeMillis() - tm); } }.start(); new Thread() { public void run() { try { Thread.sleep(2000); flag = true; } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); } }
首先是这样,这样线程永远不会退出,因为线程读到的是旧值,如果给flag加上volatile则会退出。但加了一句打印的语句就奇怪了:
public class TestThread { private static boolean flag = false; public static void main(String[] args) { new Thread() { int i = 0; public void run() { long tm = System.currentTimeMillis(); while (!flag) { i++; System.out.println(i); } System.out.println(System.currentTimeMillis() - tm); } }.start(); new Thread() { public void run() { try { Thread.sleep(2000); flag = true; } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); } }
如果这样子,即使不加上volatile,线程也会退出,求解。。我的JDK版本是1.6.0_37。
2012年12月14日 13:50
相关推荐
volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如 操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行 优化,从而可以提供...
为了测试`volatile`、`nonatomic`和`atomic`的性能差异,开发者可能会创建一个名为`volatileTest`的测试项目。这个测试可能包括创建带有不同修饰符的变量,然后在多线程环境下进行大量读写操作,通过测量执行时间来...
完整英文电子版 AEC-Q100-005D1:2012 Non-Volatile Memory Program/Erase Endurance, Data Retention, and Operational Life Test (非易失性存储器程序-擦除耐久性、数据保留和操作寿命测试 )。本测试旨在评估...
6. **VolatileMain类测试**:在`VolatileMain`类中,我们创建了两个线程来并发地访问`counter`变量。由于`counter++`操作的非原子性,输出的结果可能会显示线程并没有看到彼此的修改,这突出了volatile不能解决的...
在本文件"关于Java软件的性能测试分析.pdf"中,我们可能会探讨以下几个关键知识点: 1. **性能测试目标**:性能测试的主要目标包括确定系统的负载承受能力、响应时间、并发用户数以及系统在峰值使用情况下的稳定性...
`copy_volatile_assign.fail.c`这个文件名可能表示一个测试用例或示例代码,其中包含了一个错误的或者不推荐的拷贝赋值操作。在C++编程中,当对象包含易变(volatile)成员时,不正确的拷贝赋值可能会导致数据丢失或...
- **多线程**:Java提供了丰富的并发工具,如Thread类、Runnable接口、synchronized关键字、volatile变量和java.util.concurrent包。 - **集合框架**:ArrayList、LinkedList、HashMap、HashSet等是Java编程的基础...
- **测试寄存器**:`%tr6`, `%tr7` - **浮点寄存器**:`%st(0)`至`%st(7)` #### 3. **操作数顺序** 在AT&T汇编语言中,操作数的顺序是从左到右,即从源到目的地。例如,指令`movl %eax, %ebx`将寄存器`%eax`的内容...
- **多线程**:了解并发编程,掌握synchronized、volatile等关键字。 9. **面试技巧** - **自我介绍**:突出个人优势,展现项目经验。 - **问题解答**:清晰、有逻辑地回答问题,展示问题解决能力。 - **沟通...
3. **多线程**:线程的创建方式(Thread类和Runnable接口),同步机制(synchronized、Lock、volatile)。 4. **IO流**:字节流和字符流,缓冲流,对象序列化。 5. **JVM**:内存模型(堆、栈、方法区等),垃圾回收...
5. **多线程**:Java提供了丰富的多线程支持,如Thread类、Runnable接口、synchronized关键字、volatile变量、线程池等。测试可能涉及线程同步、互斥、并发控制和线程通信。 6. **IO流**:Java的IO流分为字节流和...
4. **多线程**:理解线程的创建(Thread类和Runnable接口),同步机制(synchronized, volatile, Lock接口)。 5. **IO流**:包括文件读写,网络通信,对象序列化等。 6. **反射机制**:用于运行时检查和修改类的...
- **volatile**:确保共享变量的值对所有线程可见,但不保证原子性,适用于简单读写操作。 - **java.util.concurrent.locks.Lock**:提供了比synchronized更细粒度的锁控制,如可重入锁(ReentrantLock)和读写锁...
NVMe(Non-Volatile Memory Express)是针对非易失性内存设备如SSD(Solid State Drives)设计的一种高速接口标准,它显著提高了存储设备的数据传输速度和效率。`nvme_cli`工具则是针对NVMe设备的一个命令行接口工具...
例如,通过使用`synchronized`关键字、`volatile`变量、`Atomic`类或者`ThreadLocal`来确保数据的一致性。 5. **竞态条件**:寻找并修复可能导致不一致状态的代码片段,这些通常发生在多个线程同时修改同一数据时。...
例如,在上述代码的单例模式测试中,`add()`方法内的`this.x++`操作并不是原子性的,即使`x`是`volatile`的,多个线程仍然可能同时增加`x`的值,导致结果不正确。为了确保原子性,我们可以使用`synchronized`关键字...
测试线程安全通常包括模拟并发环境,使用多线程进行测试,观察并分析可能产生的错误或不一致。通过编写并运行多线程测试用例,可以发现潜在的线程安全问题,然后针对性地进行修复。 总之,理解Java内存模型和掌握...
- `volatile`关键字:确保了多个线程之间的可见性,即当一个线程修改了一个被`volatile`修饰的变量时,其他线程能立即看到这个变化。 - `synchronized`关键字:用于实现方法或代码块的同步,可以防止多个线程同时...