A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. class Volatile extends Thread{
  2.         volatile int count = 0;
  3.         public void run(){
  4.                 while(true){
  5.                         if(count == 1000)break;
  6.                         System.out.println("Thread:" + count);
  7.                 }               
  8.         }
  9. }
  10. public class Test4 {

  11.         public static void main(String[] args) throws InterruptedException {
  12.                 Volatile v = new Volatile();
  13.                 v.start();       
  14.                 for(int i = 0; i < 1001; i++){               
  15.                         v.count++;       
  16.                 }
  17.         }
  18. }
复制代码
这段代码运行之后会一直输出1001,count在这里被设置成volatile型,这种类型的数据不是会绕过缓存进行读写,为什么volatile读取到却是另一个进程计算完成的结果,而不是读取到被更新后的count值?在main中v.count++后加一条sleep语句,则可以正常输出。sleep语句会引起性能的下降,有没有更好的方法使得一个进程加完后另一个进程立即输出且只输出一次便输出下一个修改后的值?

1 个回复

倒序浏览
两个线程共同操作同一个资源,可以自定义一把锁,然后使用等待唤醒机制
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马