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 修饰用在多线程对属性的访问上,而不是修改上
分享到:
相关推荐
1. 可见性:在多线程环境下,被修饰的变量在别修改后会立刻同步到主存,这样该线程对这个变量的修改就是对全部其他线程可见的,其他线程能够立刻读到这个修改后值。 2. 禁止指令重排序优化 在多线程环境下,如果...
### 深入解析volatile关键字:保障多线程下的数据一致性与可见性 #### 一、volatile的基本概念 ##### 1.1 可见性 在并发编程领域中,可见性是一个极为重要的概念,它指的是当一个线程修改了一个共享变量的值后,...
它确保了被volatile修饰的变量对所有线程都是可见的,即一旦一个线程修改了volatile变量,其他线程能立即看到这一变化,避免了数据不一致的情况。这是通过Java内存模型(JMM)实现的,JMM规定了线程如何访问共享内存...
`volatile`是一个存储类修饰符,告诉编译器某个变量的值可能会在编译器无法察觉的情况下发生变化,例如由硬件中断、操作系统调用或另一个线程修改。因此,对于`volatile`修饰的变量,编译器不会将其值缓存在寄存器或...
3. 多线程应用中被几个任务共享的变量:在多线程应用中,变量的值可能会被其他线程改变,因此需要使用volatile修饰符来确保编译器每次都读取最新的值。 需要注意的是,volatile修饰符并不是说这个变量的值一定会...
总的来说,`volatile`关键字在Java多线程编程中起到的关键作用是提供轻量级的同步机制,解决了变量在多线程环境下的可见性和有序性问题。然而,它不能替代所有的同步机制,对于需要保证原子性的操作或对多个变量的...
默认情况下,Objective-C的属性是`atomic`的,这意味着在多线程环境下,读写操作是线程安全的,即在读取或写入时,会确保整个操作的完整性,不会出现数据竞争。但是,`atomic`并不能保证数据的一致性,特别是在多个...
Servlet和Struts Action是两种常见的Java Web开发组件,它们在多线程环境下运行时可能存在线程安全问题。线程安全是指在多线程环境中,一个类或者方法能够正确处理多个线程的并发访问,保证数据的一致性和完整性。 ...
在并行设备的硬件寄存器、中断服务子程序和多线程应用中的共享变量中,volatile 变量非常重要。 在编程中,需要正确地理解 volatile 变量的作用和应用场景,以确保程序的正确性和效率。 此外,需要注意的是,...
- volatile:修饰变量,确保多线程环境下的可见性和有序性,但不保证原子性。在实例中,可能用于共享标志的设置与读取。 - wait()、notify()和notifyAll():这些方法存在于Object类中,用于线程间的通信。在线程A...
在编程领域,线程安全是多线程编程中的一个重要概念,尤其在Java、C++等支持并发编程的语言中。线程安全通常指的是当多个线程访问一个对象时,如果对象的状态始终保持一致,那么我们就说这个对象是线程安全的。这里...
Java标准库中有一些类,如ArrayList、HashMap和SimpleDateFormat,并未设计为线程安全,因此在多线程环境下直接使用可能导致数据不一致或其他问题。开发者应当了解每个类的线程安全特性,以便做出正确的选择和适当地...
当一个变量被volatile修饰后,任何线程修改了该变量,其他线程都能立即看到这个变化。这避免了由于工作内存中缓存的旧值而导致的数据不一致问题。 3. **有序性**:Java允许编译器和处理器对指令进行重排序,这在单...
2. volatile关键字:保证了变量在多线程环境下的可见性和有序性,但不保证原子性。 3. Lock接口与ReentrantLock类:提供了比synchronized更细粒度的锁控制,具有可重入性、公平性等特点,可以配合Condition进行条件...
Java 多线程(Synchronized+Volatile+JUC 并发工具原理+线程状态+CAS+线程池) Java 多线程是 Java 语言中的一...但是,多线程编程也存在一些挑战,如线程安全、死锁、饥饿等问题,因此需要小心设计和实施多线程程序。
2. 多线程编程:在多线程环境下,当一个变量可能被其他线程修改时,应使用`volatile`,让编译器知道这个变量的值可能会在不通过程序控制的情况下发生变化。 3. 实时系统:在实时系统中,`volatile`用于声明受外部...
volatile是C#中用于控制同步的关键字,其意义是针对程序中一些敏感数据,不允许多线程同时访问,保证数据在任何访问时刻,最多有一个线程访问,以保证数据的完整性,volatile是修饰变量的修饰符。 1、volatile的使用...
在多线程编程中,线程间通讯可以使用全局变量、自定义消息等方法来实现。 一、使用全局变量进行通信 在 C++ 中,使用全局变量可以实现线程间通讯。由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故...
它主要用于修饰变量,表明该变量的值可能会在编译器不知情的情况下发生变化,例如由其他线程修改、外部硬件事件影响或者操作系统内核的行为。因此,当一个变量被声明为`volatile`时,编译器不会对访问该变量的代码...