public class NoVisibility {
private static boolean ready;
private static int number;
private static class ReaderThread extends Thread{
public void run(){
while(!ready){
Thread.yield();
System.out.println(number);
}
}//end run()
}//end Class ReaderThread
public static void main(String[] args){
new ReaderThread().start();
number = 42;
ready = true;
}
}
NoVisibility可能不会打印任何值,因为读线程可能永远看不到ready的值。一种更奇怪的现象是,NoVisibility可能会输出0,因为读线程可能看到了写入的ready的值,但是却没有看到之后写入的number的值。只要有数据在多个线程之间共享,就应该使用正确的同步。
public class MutableInteger {
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
MutableInteger不是线程安全的,因为get和set都是在没有同步的情况下访问value的。
public class SynchronizedInteger {
@GuardedBy("this")private int value;
public synchronized int getValue() {
return value;
}
public synchronized void setValue(int value) {
this.value = value;
}
}
SynchronizedInteger中,通过对get和set方法进行同步,可以使MutableInteger成为一个线程安全类。仅对set方法进行同步是不够的。另外,在多线程程序中使用共享且可变的long和double等类型的变量也是不安全的,可以使用volatile来声明,或者用锁保护起来(加锁机制既可以确保可见性又可以确保原子性,而volatile变量只嗯呢该确保可见性)。
分享到:
相关推荐
Java提供了synchronized关键字和volatile变量来保证可见性和互斥性,确保多个线程在访问共享数据时的正确性。此外,java.util.concurrent包提供了高级并发工具,如Semaphore(信号量)、CyclicBarrier(循环屏障)和...
JMM规定了线程如何访问共享内存,如何保证可见性、原子性和有序性。书中会详细阐述 volatile 的工作原理,以及如何利用其确保线程间的正确通信。 此外,Java并发集合框架是另一个重要章节。它包含一系列优化过的...
- **volatile**:了解volatile如何保证内存可见性和禁止指令重排序,以确保多线程环境下的数据一致性。 - **synchronized**:深入理解synchronized的 Monitor 模型,包括可重入性、锁升级机制以及监视器锁与对象头...
- ** volatile** 关键字 用于保证变量的可见性,但不保证原子性。 - **Lock接口与ReentrantLock** 提供了比`synchronized`更细粒度的锁控制,可以实现公平锁和非公平锁,以及可中断和可重入的特性。 4. **并发...
最后,Java并发编程还需要关注内存模型和可见性。Java内存模型(JMM)规定了线程如何访问和修改共享变量,以确保正确的行为。volatile和synchronized关键字都与JMM有关,它们确保了线程之间的内存可见性。 总之,...
`volatile`关键字保证变量的可见性和有序性;`java.util.concurrent`包下的`Semaphore`、`Lock`、`ReentrantLock`等工具类提供了更为灵活的锁机制。此外,`wait()`、`notify()`和`notifyAll()`方法用于线程间的通信...
还有`volatile`关键字,它能确保共享变量的可见性和有序性。另外,`ReentrantLock`是可重入锁,提供了比`synchronized`更灵活的锁定机制。 4. **并发容器**:`ArrayList`、`LinkedList`等集合在并发环境下可能存在...
在Java中,volatile关键字用于确保共享变量的可见性和有序性,避免伪共享和数据不一致性。另外,final字段在多线程环境中具有不变性,可以用来确保数据安全。 Java并发集合,如ConcurrentHashMap、...
《java并发编程实战》读书笔记-第3章-对象的共享,脑图形式,使用xmind8制作 包括可见性、发布与逸出、线程封闭、不可变性、安全发布等内容
- **volatile关键字**:分析volatile如何实现线程间共享变量的可见性,并防止指令重排序。 8. **Future与Callable** - **Future接口**:代表异步计算的结果,可以检查是否完成,取消任务,或获取结果。 - **...
- **JMM**:Java内存模型定义了线程如何访问和更新共享变量,以及如何确保多线程环境下的可见性和一致性。JMM通过内存屏障和volatile、synchronized关键字来保证并发编程的安全性。 5. **并发的优势与风险** - **...
2. **同步机制**:包括`synchronized`关键字、`volatile`变量、`Lock`接口(如ReentrantLock)等,它们用于保证共享数据的可见性和一致性,防止数据竞争。 3. **并发集合**:Java提供了一系列线程安全的集合,如`...
然而,`volatile`只能保证可见性,不能保证原子性,因此在处理复合操作时需要谨慎使用。 #### 2.5 活性 活性(Liveness)是多线程系统中的一个重要概念,与死锁、饥饿和活锁等问题相对应。活性问题通常发生在线程...
《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...
3.1.3 加锁与可见性 3.1.4 Volatile变量 3.2 发布与逸出 3.3 线程封闭 3.3.1 Ad-hoc线程封闭 3.3.2 栈封闭 3.3.3 ThreadLocal类 3.4 不变性 3.4.1 Final域 3.4.2 示例:使用Volatile类型来发布不可变对象...
- **volatile变量**:保证了线程间的可见性,但不保证原子性,适用于简单共享变量的读写操作。 3. **并发工具类** - **`java.util.concurrent`包**:包含各种并发工具类,如`ExecutorService`、`Future`、`...
#### 二、Java并发核心概念 在深入讨论具体技术细节之前,我们先了解一些关键的Java并发概念: 1. **Java Memory Model (JMM)**: - **定义**: 在Java SE 5 (JSR133)中引入的Java Memory Model (JMM)旨在确保编写...