zoukankan      html  css  js  c++  java
  • review38

    Java程序中可以存在多个线程,但是在处理多线程问题时,必须注意这样一个问题:当两个或多个线程同时访问同一个变量,并且一些线程需要修改这个变量。这时可能发生混乱。

    所谓线程同步就是若干个线程都需要一个synchronized(同步)修饰的方法。

    线程同步机制:当一个线程A使用synchronized方法时,其他线程想使用这个synchronized方法时就必须等待,直到线程A使用完该synchronized方法。

    public class Test04 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Bank bank = new Bank();
            bank.setMoney(200);
            Thread accountant, cashier;
            accountant = new Thread(bank);
            cashier = new Thread(bank);
            accountant.setName("会计");
            cashier.setName("出纳");
            accountant.start();
            cashier.start();
        }
    
    }

    Bank.java

    public class Bank implements Runnable {
    
        int money = 200;
        public void setMoney(int n)
        {
            money = n;
        }
        @Override
        public void run() {
            // TODO Auto-generated method stub
            if(Thread.currentThread().getName().equals("会计"))
            {
                saveOrTake(300);
            }
            else if(Thread.currentThread().getName().equals("出纳"))
            {
                saveOrTake(150);
            }
            
        }
        
        public synchronized void saveOrTake(int amount)
        {
            if(Thread.currentThread().getName().equals("会计"))
            {
                for(int i = 1; i <= 3; i++)
                {
                    money = money + amount / 3;
                    System.out.println(Thread.currentThread().getName() + "存入" 
                    + amount/3 + ",帐上有" + money + "万,休息一会再存");
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    
                }
            }
            else if(Thread.currentThread().getName().equals("出纳"))
            {
                for(int i = 1; i <= 3; i++)
                {
                    money = money - amount / 3;
                    System.out.println(Thread.currentThread().getName() + "取出" +
                    amount/3 + ",账上有" + money + "万,休息一会儿再取");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    
    }

    运行结果如下所示:

  • 相关阅读:
    世界疫情可视化开发(一)
    世界疫情可视化开发(三)-- world.jsp
    团队冲刺5
    课下作业1-扩展阅读
    团队冲刺4
    团队冲刺3
    冲刺个人感想
    团队冲刺开始
    Android Studio Toast(吐司)的基本使用
    GridLayout(网格布局)
  • 原文地址:https://www.cnblogs.com/liaoxiaolao/p/9489417.html
Copyright © 2011-2022 走看看