Leonardo||Watch 2020-05-26 18:38 采纳率: 100%
浏览 617
已采纳

java多线程资源共享问题

有存入和支出两个线程,对共同账户操作

package threads;

public class Money implements Runnable{
    Thread in=new Thread(this,"会计");
    Thread out=new Thread(this,"出纳");
    private int money=200;
    public  void run(){
        int i=0,o=0;
        int m1;
        while(i<3&&o<3){
            m1=money;
            io();
        if(m1>money)
            o++;
        else
            i++;
    }
  }
    public synchronized void io(){
        try{
            Thread.sleep(1000);
        }catch(Exception e){

        }
        if(Thread.currentThread()==in){
            money+=100;
            System.out.println("存入100元,余额:"+money);
            }
        else{
                money-=50;
                System.out.println("支出50元,余额:"+money);
    }
    }
}


存入100元,余额:300
存入100元,余额:400
存入100元,余额:500
支出50元,余额:450
支出50元,余额:400
支出50元,余额:350
支出50元,余额:300
为什么线程没有并发,而且支出发生了四次?
  • 写回答

1条回答 默认 最新

  • qybao 2020-05-27 14:37
    关注

    因为sleep不会释放锁,把sleep放到run的while里去(不要让sleep的线程一直占用锁)

    public class Money implements Runnable{
        Thread in=new Thread(this,"会计");
        Thread out=new Thread(this,"出纳");
        private int money=200;
        public  void run(){
            int i=0,o=0;
            int m1;
            while(i<3&&o<3){
                m1=money;
                io();
            if(m1>money)
                o++;
            else
                i++;
            try{
                Thread.sleep(1000); //在这里sleep
            }catch(Exception e){
    
            }
        }
      }
        public synchronized void io(){
            if(Thread.currentThread()==in){
                money+=100;
                System.out.println("存入100元,余额:"+money);
                }
            else{
                    money-=50;
                    System.out.println("支出50元,余额:"+money);
        }
        }
    }
    

    这种资源共享,最好去参考一下生产者消费者模式,用wait和notifyAll来控制比较好

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥200 基于同花顺supermind的量化策略脚本编辑
  • ¥20 Html备忘录页面制作
  • ¥15 黄永刚的晶体塑性子程序中输入的材料参数里的晶体取向参数是什么形式的?
  • ¥20 数学建模来解决我这个问题
  • ¥15 计算机网络ip分片偏移量计算头部是-20还是-40呀
  • ¥15 stc15f2k60s2单片机关于流水灯,时钟,定时器,矩阵键盘等方面的综合问题
  • ¥15 YOLOv8已有一个初步的检测模型,想利用这个模型对新的图片进行自动标注,生成labellmg可以识别的数据,再手动修改。如何操作?
  • ¥30 NIRfast软件使用指导
  • ¥20 matlab仿真问题,求功率谱密度
  • ¥15 求micropython modbus-RTU 从机的代码或库?