`

多线程---可见性

    博客分类:
  • java
阅读更多

近日在看《JAVA并发编程实践》一书,看到可见性一节,有一疑问,请看代码:

package com.eshore.mall.common;

public class VisibleTest {
    private static boolean ready = false;
    private static int number = 0;

    public static void main(String[] args) {
        new Thread(new Runnable() {

            @Override
            public void run() {
                while (!ready) {
                    try {
                        Thread.yield();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(number);
            }
        }).start();
        number = 42;
        ready = true;
    }

}

 书说打印结果有三种可能:1)0,2)永远不会终止,3)42

但我在本地上跑都是42,什么原因呢?

分享到:
评论

相关推荐

    多线程-day02.docx

    多线程编程的核心是保证三个特性:原子性、可见性和有序性。 - **原子性**:确保操作不可分割,要么全做要么不做,避免并发执行时的中断问题。 - **可见性**:线程间对共享变量的修改能立即被其他线程感知。 - **...

    Java多线程-知识点梳理和总结-超详细-面试知识点.docx

    volatile关键字是Java中的一种线程同步机制,用于解决多线程环境下的可见性和有序性问题。volatile关键字可以确保变量的修改对所有线程可见,并且可以禁止编译器和处理器对变量的优化。 Java内存模型 Java内存模型...

    人工智能-项目实践-多线程-Java多线程高并发实例.zip

    5. **原子类**:`AtomicInteger`、`AtomicLong`等原子类提供了在不使用锁的情况下进行原子操作的方法,它们在多线程环境下能保证操作的原子性和可见性。 6. **Future和Callable接口**:它们可以用来异步执行任务,...

    多线程-狂神说Java学习笔记

    2. **volatile关键字**:保证共享变量的可见性,但不保证原子性。 3. **Lock接口与ReentrantLock**:提供更细粒度的锁控制,支持公平锁、非公平锁、读写锁等。 4. **ThreadLocal**:为每个线程提供局部变量副本,...

    Java多线程 - (一) 最简单的线程安全问题

    2. **volatile**关键字:它确保了多线程环境下的可见性和有序性,但不保证原子性。对于简单的读写操作,volatile可以替代`synchronized`。 ```java public class Counter { private volatile int count = 0; ...

    java线程-Java内存模型

    Java内存模型(JMM)是Java虚拟机规范的一部分,用于定义程序中各个线程对共享变量的访问规则,包括线程之间的通信、内存可见性和原子性等问题。 首先,Java内存模型规定了三个主要区域:程序计数器、虚拟机栈、...

    Java多线程-解决单例模式中的懒汉式的线程安全问题

    ### Java多线程—解决单例模式中的懒汉式的线程安全问题 #### 一、单例设计模式的线程安全问题 ##### (1)饿汉式没有线程安全问题 **饿汉式**是一种非常典型的单例模式实现方式,其特点是在类加载时就完成了实例...

    多线程-572e342b467d4057bc1bb089fa0a8483.pdf

    Volatile关键字用于保证变量的可见性,即一个线程修改了volatile变量后,其他线程能够立即看到新的值。不过volatile并不能保证操作的原子性,因此,通常用于确保线程读写共享变量时能立即看到最新的值。 ...

    WHUT-java多线程实验-第一周-继承、多态.zip

    在Java中,我们通过定义类(class)来实现封装,使用访问修饰符(如private, public, protected)控制成员变量和方法的可见性。实验可能涉及创建一个类,隐藏内部实现细节,只暴露必要的公共方法供其他类调用。 2. ...

    线程 - 实例详解(从初级到高级系列讲解)

    - **不可变对象**:不可变对象在多线程环境中具有天然的线程安全性。 - **事件等待句柄(Event Wait Handles)**:这是一种用于跨线程通信的同步原语,包括自动重置事件和手动重置事件。 #### 六、使用线程 - **基于...

    Java线程-第三版(CHM电子版)

    10. **Java内存模型**:深入解析Java内存模型(JMM),包括可见性、有序性和原子性,以及它们如何影响多线程程序的行为。 通过阅读《Java线程——第三版》,读者将能够掌握Java平台上的多线程编程技术,解决实际...

    java多线程源码-source

    volatile关键字用于确保共享变量的可见性和有序性,避免数据的不一致。当一个变量被声明为volatile时,它的修改对所有线程都是可见的。 6. wait(), notify(), notifyAll() 这些方法是Object类的一部分,用于线程...

    Java多线程编程实战指南-核心篇

    JMM定义了线程如何访问共享变量的规则,保证了多线程环境下的可见性和有序性。volatile确保了线程之间的数据一致性,但并不能保证原子性,因此在某些场景下需要配合synchronized使用。 通过《Java多线程编程实战...

    Cocoa多线程开发Objective-C详解

    在iOS开发中,多线程技术是提高应用性能、增强用户...随着iOS系统和硬件的发展,多线程技术在开发中的重要性将越来越显著。掌握GCD等并发编程技术,无疑将帮助开发者更好地发挥iOS平台的性能优势,提升产品的竞争力。

    线程互斥--多线程学习

    5. **内存屏障**:内存屏障是一种硬件指令,用于确保某些内存操作的顺序,防止编译器和处理器优化导致的数据可见性问题。 在"如何创建UI线程"这个话题中,UI线程(通常称为主线程)负责处理用户界面的事件,如点击...

    多线程demo/java多线程练习

    - **volatile变量**:保证了内存可见性和有序性,但不保证原子性。在`ThreadDemo-master`中,可能会看到volatile如何应用于共享变量。 - **Atomic类**:提供了一组原子操作,如`AtomicInteger`,在多线程环境下...

    java多线程的讲解和实战

    - `volatile`关键字:用于标记共享变量,确保多线程环境下的可见性和有序性,但不保证原子性。 - `join()`方法:让当前线程等待另一个线程完成其执行。 4. **线程优先级与调度**:Java的`Thread`类提供了设置线程...

    Java多线程中提到的原子性和可见性、有序性1

    Java多线程编程中,原子性、可见性和有序性是三个关键的概念,它们确保了多线程环境下的正确性。 1. 原子性(Atomicity) 原子性指的是一个操作不可被中断,要么全部执行,要么完全不执行。在Java中,非原生类型的...

    线程-java-包括实验报告

    volatile确保了变量的可见性和有序性,但无法防止数据竞争;Lock提供了更细粒度的控制,支持公平锁和非公平锁,以及可中断和可尝试获取锁的特性。 实验报告通常会包含以下部分: 1. 实验目的:明确学习线程的重要性...

    4JAVA编程高级-多线程编程

    - `volatile`关键字:保证了变量的可见性和有序性,但不能保证原子性。 **死锁** 死锁是多线程编程中常见的一个问题,它发生在两个或更多的线程永久阻塞,每个线程都在等待另一个线程释放资源的情况。解决死锁的...

Global site tag (gtag.js) - Google Analytics