`
羽鹤彬
  • 浏览: 49620 次
社区版块
存档分类
最新评论

java并发(二)对象的共享-可见性

阅读更多
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变量只嗯呢该确保可见性)。
0
0
分享到:
评论

相关推荐

    Java并发编程实践--电子书.rar

    Java提供了synchronized关键字和volatile变量来保证可见性和互斥性,确保多个线程在访问共享数据时的正确性。此外,java.util.concurrent包提供了高级并发工具,如Semaphore(信号量)、CyclicBarrier(循环屏障)和...

    ( Java并发程序设计教程.zip )高清版 PDF

    JMM规定了线程如何访问共享内存,如何保证可见性、原子性和有序性。书中会详细阐述 volatile 的工作原理,以及如何利用其确保线程间的正确通信。 此外,Java并发集合框架是另一个重要章节。它包含一系列优化过的...

    实战Java高并发程序设计第二版随书代码

    - **volatile**:了解volatile如何保证内存可见性和禁止指令重排序,以确保多线程环境下的数据一致性。 - **synchronized**:深入理解synchronized的 Monitor 模型,包括可重入性、锁升级机制以及监视器锁与对象头...

    java并发编程2

    - ** volatile** 关键字 用于保证变量的可见性,但不保证原子性。 - **Lock接口与ReentrantLock** 提供了比`synchronized`更细粒度的锁控制,可以实现公平锁和非公平锁,以及可中断和可重入的特性。 4. **并发...

    Java并发程序设计教程

    最后,Java并发编程还需要关注内存模型和可见性。Java内存模型(JMM)规定了线程如何访问和修改共享变量,以确保正确的行为。volatile和synchronized关键字都与JMM有关,它们确保了线程之间的内存可见性。 总之,...

    JAVA并发编程实践-中文-高清-带书签-完整版

    `volatile`关键字保证变量的可见性和有序性;`java.util.concurrent`包下的`Semaphore`、`Lock`、`ReentrantLock`等工具类提供了更为灵活的锁机制。此外,`wait()`、`notify()`和`notifyAll()`方法用于线程间的通信...

    Java高并发经典文档-PDF-可在电子书里查看

    还有`volatile`关键字,它能确保共享变量的可见性和有序性。另外,`ReentrantLock`是可重入锁,提供了比`synchronized`更灵活的锁定机制。 4. **并发容器**:`ArrayList`、`LinkedList`等集合在并发环境下可能存在...

    Java并发编程常识-梁飞.rar

    在Java中,volatile关键字用于确保共享变量的可见性和有序性,避免伪共享和数据不一致性。另外,final字段在多线程环境中具有不变性,可以用来确保数据安全。 Java并发集合,如ConcurrentHashMap、...

    《java并发编程实战》读书笔记-第3章-对象的共享

    《java并发编程实战》读书笔记-第3章-对象的共享,脑图形式,使用xmind8制作 包括可见性、发布与逸出、线程封闭、不可变性、安全发布等内容

    Java高并发经典文档-MOBI-可在电子书里查看

    - **volatile关键字**:分析volatile如何实现线程间共享变量的可见性,并防止指令重排序。 8. **Future与Callable** - **Future接口**:代表异步计算的结果,可以检查是否完成,取消任务,或获取结果。 - **...

    Java并发编程与高并发解决方案笔记-基础篇.docx

    - **JMM**:Java内存模型定义了线程如何访问和更新共享变量,以及如何确保多线程环境下的可见性和一致性。JMM通过内存屏障和volatile、synchronized关键字来保证并发编程的安全性。 5. **并发的优势与风险** - **...

    Java 并发编程实战-随书源码

    2. **同步机制**:包括`synchronized`关键字、`volatile`变量、`Lock`接口(如ReentrantLock)等,它们用于保证共享数据的可见性和一致性,防止数据竞争。 3. **并发集合**:Java提供了一系列线程安全的集合,如`...

    Java并发编程实践-电子书-02章

    然而,`volatile`只能保证可见性,不能保证原子性,因此在处理复合操作时需要谨慎使用。 #### 2.5 活性 活性(Liveness)是多线程系统中的一个重要概念,与死锁、饥饿和活锁等问题相对应。活性问题通常发生在线程...

    JAVA并发编程艺术pdf版

    《JAVA并发编程艺术》是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类型来发布不可变对象...

    java 并发编程实践

    - **volatile变量**:保证了线程间的可见性,但不保证原子性,适用于简单共享变量的读写操作。 3. **并发工具类** - **`java.util.concurrent`包**:包含各种并发工具类,如`ExecutorService`、`Future`、`...

    Java 并发核心编程

    #### 二、Java并发核心概念 在深入讨论具体技术细节之前,我们先了解一些关键的Java并发概念: 1. **Java Memory Model (JMM)**: - **定义**: 在Java SE 5 (JSR133)中引入的Java Memory Model (JMM)旨在确保编写...

Global site tag (gtag.js) - Google Analytics