当多个线程对共享的数据进行操作时,为了保证不破坏数据的完整性应使其成为一个原子操作,所谓原子操作就是指在没有完成相关操作之前不允许其他线程打断他,否则就会破坏数据的完整性,得到错误的结果,给你举一个较为经典的例子吧关于从银行取款的问题
- public class MyTestBank {
- public static void main(String[] args) {
- Thread t1 = new Thread(new Constomer());
- Thread t2 = new Thread(new Constomer());
- t1.start();
- t2.start();
- }
- }
- class Bank {
- private static int balance = 4000;
- public static void getMoney(int value) {
- balance = balance - value;
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- System.out.println("余额为" + balance);
- }
- }
- class Constomer implements Runnable {
- @Override
- public void run() {
- // TODO Auto-generated method stub
- for(int i = 1; i < 12; i++) {
- Bank.getMoney(100);
- }
- }
- }
复制代码 余额为3800
余额为3700
余额为3600
余额为3500
余额为3400
余额为3300
余额为3200
余额为3200
余额为3000
这是运行的结果,看出问题了吧,这时只需要在public static void getMoney(int value)改为public synchronized static void getMoney(int value)即可安全的访问共享资源(但是效率降低了),因为加上了synchronized 这个关键字,导致某个线程访问共享数据时使其成为了一个不可分的原子操作 |