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 修饰用在多线程对属性的访问上,而不是修改上