`
geelong
  • 浏览: 115669 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

volatile 修饰的属性,在多线程修改下,也是线程不安全的

阅读更多

volatile 修饰的对象,在多线程修改下,也是线程不安全的

 

package ThreadTest;

public class ThreadTest3 {
	public static void main(String args[]){
        MyThread mt = new MyThread() ;    // 定义线程对象
   
        Thread t1 = new Thread(mt) ;    // 定义Thread对象
        Thread t2 = new Thread(mt) ;    // 定义Thread对象
        Thread t3 = new Thread(mt) ;    // 定义Thread对象
        t1.start() ;
        t2.start() ;
        t3.start() ;
    }
}

class MyThread implements Runnable{
    private volatile int ticket = 5 ;    // 假设一共有5张票
    public void run(){
    	sale();
    }
//    private synchronized void sale(){
    private void sale(){
    	 while(ticket>0){
             try {
                 Thread.sleep(300);
             } catch (InterruptedException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
             System.out.println("卖票:ticket = " + ticket-- );
         }
    }
}

 

 

卖票:ticket = 5

卖票:ticket = 5

卖票:ticket = 4

卖票:ticket = 3

卖票:ticket = 3

卖票:ticket = 2

卖票:ticket = 0

卖票:ticket = -1

卖票:ticket = 1

 

 

 

volatile 修饰用在多线程对属性的访问上,而不是修改上

 

分享到:
评论

相关推荐

    2020面试题总结多线程篇.pdf

    在使用场景中,轻量级锁 volatile 是不能取代 synchronized,但也可以在有限的一些情形下可以用 volatile 变量代替锁。 四、sleep 和 wait 的区别 sleep 和 wait 的区别主要有四点: * sleep() 方法是 Thread 类...

    C#中volatile与lock用法

    volatile是C#中用于控制同步的关键字,其意义是针对程序中一些敏感数据,不允许多线程同时访问,保证数据在任何访问时刻,最多有一个线程访问,以保证数据的完整性,volatile是修饰变量的修饰符。 1、volatile的使用...

    Linux C中多线程与volatile变量

    在多线程环境下,每个线程都有一个独立的寄存器,用于保存当前执行的指令。假设我们定义了一个全局变量,每个线程都会访问这个全局变量,这时候线程的寄存器可能会存储全量变量的当前值用于后续的访问。当某个线程...

    C++ volatile 详解

    例如,在多线程编程中,一个变量的值可能会被其他线程改变。在这种情况下,如果编译器对代码进行优化,可能会导致线程之间的数据不一致。因此,使用 volatile 关键字可以确保变量的值总是从内存中读取,而不是从...

    嵌入式系统/ARM技术中的volatile在多线程中的应用

    volatile是一个关键字,用来修饰一个变量,告诉编译器在编译的时候不要对其进行优化,在操作寄存器和多线程中这种用法是最常见的。  有这样一个例子:  #include  #include  void my_func();  int? i; ...

    Java中volatile关键字的含义

    在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候可以万事大吉。  Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 ...

    Java并发学习-AtomicIntegerFieldUpdater字段原子更新类.docx

    字段必须是volatile类型的,在线程之间共享变量时保证立即可见 字段的描述类型( 修饰符public/protected/default/private )是与调用者与操作对象字段的关系一致。 也就是说调用者能够直接操作对象字段 ,...

    手写一个线程安全的非阻塞队列,并且实现入队出队方法

    在往队列中添加元素的时候,新建一个节点,加入到队尾,加入到队尾的操作,利用CAS原理加乐观锁,另外,还需要将新加的节点设置为新的队尾,此步操作也需要利用CAS,head与tail变量用volatile修饰,保证多线程环境下...

    Java中Volatile关键字步骤

    也是一个线程修改的结果。另一个线程马上能看到。比如:用volatile修饰的变量,会具有可见性。volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程时可见的。但是这里需要注意个问题,...

    java多线程中的volatile和synchronized用法分析

    主要介绍了java多线程中的volatile和synchronized用法分析,以实例的形式分析了在多线程中volatile和synchronized的用法区别与使用原理,具有一定的参考借鉴价值,需要的朋友可以参考下

    Java 高频面试题:聊一聊 JUC 下的 CopyOnWriteArrayList

    ArrayList 是我们常用的工具类之一,但是在多线程的情况下,ArrayList 作为共享变量时,并不是线程安全的。主要有以下两个原因: 1、ArrayList 自身的 elementData、size、modCount 在进行操作的时候,都没有加锁 ...

    浅析java volatitle 多线程问题

    Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存

    设计模式.pdf_电子版_pdf版

    但是这种实现方式在多线程环境下是不安全的,因为多个线程能够同时进入 if (uniqueInstance == null) 语句块,并且此时 uniqueInstance 为 null,那么会有多个线程执行 uniqueInstance = new Singleton();...

    C++大厂面试真题宝典 精选100道完结7章

    volatile关键字主要用于解决变量在多个线程之间的可见性,而 synchronized 关键字解决的是多个线程之间访问资源的同步性。 2、C语言中struct和union的区别 在存储多个成员信息时,编译器会自动给struct第一个成员...

    C++中volatile和mutable关键字用法详解

    C/C++中的volatile关键字和const对应,用来修饰变量,用于告诉编译器该变量值是不稳定的,可能被更改。使用volatile注意事项: (1). 编译器会对带有volatile关键字的变量禁用优化(A volatile specifier is a hint to...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【多线程】Volatile的理解 82 【*多线程】synchronized底层如何实现的? 82 【多线程】Callable 和 Runnable接口 82 【多线程】Java四种线程池的创建方法 83 【多线程】线程池原理和运行机制 83 【多线程】线程池对...

    volaitle、namespace、C++11的auto和decltype1

    volatile : 易变的,被修饰的变量禁止编译器做任何的优化应用场景:主要用于多线程环境namespace命名空间解决命名问题前缀:解决命名冲突,但也会使得

    c#学习笔记.txt

    volatile指示字段可由操作系统、硬件或并发执行的线程等在程序中进行修改。 9,语句 语句是程序指令。除非特别说明,语句都按顺序执行。C# 具有下列类别的语句。 类别C# 关键字 选择语句if, else, switch, case 迭代...

    2023年Java面试题必备知识点

    最新2023年Java面试题必备知识点: ...2、在 Java 程序中怎么保证多线程的运行安全? 3、volatile 修饰符的有过什么实践? 4、Java中各种数据默认值 . . 7、synchronized 和 Lock 有什么区别? ......

    Java常见面试题208道.docx

    47.在 java 程序中怎么保证多线程的运行安全? 48.多线程锁的升级原理是什么? 49.什么是死锁? 50.怎么防止死锁? 51.ThreadLocal 是什么?有哪些使用场景? 52.说一下 synchronized 底层实现原理? 53....

Global site tag (gtag.js) - Google Analytics