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 修饰用在多线程对属性的访问上,而不是修改上
分享到:
相关推荐
在使用场景中,轻量级锁 volatile 是不能取代 synchronized,但也可以在有限的一些情形下可以用 volatile 变量代替锁。 四、sleep 和 wait 的区别 sleep 和 wait 的区别主要有四点: * sleep() 方法是 Thread 类...
volatile是C#中用于控制同步的关键字,其意义是针对程序中一些敏感数据,不允许多线程同时访问,保证数据在任何访问时刻,最多有一个线程访问,以保证数据的完整性,volatile是修饰变量的修饰符。 1、volatile的使用...
在多线程环境下,每个线程都有一个独立的寄存器,用于保存当前执行的指令。假设我们定义了一个全局变量,每个线程都会访问这个全局变量,这时候线程的寄存器可能会存储全量变量的当前值用于后续的访问。当某个线程...
例如,在多线程编程中,一个变量的值可能会被其他线程改变。在这种情况下,如果编译器对代码进行优化,可能会导致线程之间的数据不一致。因此,使用 volatile 关键字可以确保变量的值总是从内存中读取,而不是从...
volatile是一个关键字,用来修饰一个变量,告诉编译器在编译的时候不要对其进行优化,在操作寄存器和多线程中这种用法是最常见的。 有这样一个例子: #include #include void my_func(); int? i; ...
在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候可以万事大吉。 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 ...
字段必须是volatile类型的,在线程之间共享变量时保证立即可见 字段的描述类型( 修饰符public/protected/default/private )是与调用者与操作对象字段的关系一致。 也就是说调用者能够直接操作对象字段 ,...
在往队列中添加元素的时候,新建一个节点,加入到队尾,加入到队尾的操作,利用CAS原理加乐观锁,另外,还需要将新加的节点设置为新的队尾,此步操作也需要利用CAS,head与tail变量用volatile修饰,保证多线程环境下...
也是一个线程修改的结果。另一个线程马上能看到。比如:用volatile修饰的变量,会具有可见性。volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程时可见的。但是这里需要注意个问题,...
主要介绍了java多线程中的volatile和synchronized用法分析,以实例的形式分析了在多线程中volatile和synchronized的用法区别与使用原理,具有一定的参考借鉴价值,需要的朋友可以参考下
ArrayList 是我们常用的工具类之一,但是在多线程的情况下,ArrayList 作为共享变量时,并不是线程安全的。主要有以下两个原因: 1、ArrayList 自身的 elementData、size、modCount 在进行操作的时候,都没有加锁 ...
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存
但是这种实现方式在多线程环境下是不安全的,因为多个线程能够同时进入 if (uniqueInstance == null) 语句块,并且此时 uniqueInstance 为 null,那么会有多个线程执行 uniqueInstance = new Singleton();...
volatile关键字主要用于解决变量在多个线程之间的可见性,而 synchronized 关键字解决的是多个线程之间访问资源的同步性。 2、C语言中struct和union的区别 在存储多个成员信息时,编译器会自动给struct第一个成员...
C/C++中的volatile关键字和const对应,用来修饰变量,用于告诉编译器该变量值是不稳定的,可能被更改。使用volatile注意事项: (1). 编译器会对带有volatile关键字的变量禁用优化(A volatile specifier is a hint to...
【多线程】Volatile的理解 82 【*多线程】synchronized底层如何实现的? 82 【多线程】Callable 和 Runnable接口 82 【多线程】Java四种线程池的创建方法 83 【多线程】线程池原理和运行机制 83 【多线程】线程池对...
volatile : 易变的,被修饰的变量禁止编译器做任何的优化应用场景:主要用于多线程环境namespace命名空间解决命名问题前缀:解决命名冲突,但也会使得
volatile指示字段可由操作系统、硬件或并发执行的线程等在程序中进行修改。 9,语句 语句是程序指令。除非特别说明,语句都按顺序执行。C# 具有下列类别的语句。 类别C# 关键字 选择语句if, else, switch, case 迭代...
最新2023年Java面试题必备知识点: ...2、在 Java 程序中怎么保证多线程的运行安全? 3、volatile 修饰符的有过什么实践? 4、Java中各种数据默认值 . . 7、synchronized 和 Lock 有什么区别? ......
47.在 java 程序中怎么保证多线程的运行安全? 48.多线程锁的升级原理是什么? 49.什么是死锁? 50.怎么防止死锁? 51.ThreadLocal 是什么?有哪些使用场景? 52.说一下 synchronized 底层实现原理? 53....