黑马程序员技术交流社区

标题: 在Java语言中线程同步? 在同步机制中,原子操作又是什么... [打印本页]

作者: 王小丑    时间: 2013-1-29 18:33
标题: 在Java语言中线程同步? 在同步机制中,原子操作又是什么...
本帖最后由 张向辉 于 2013-1-30 11:57 编辑

在Java语言中线程同步? 在同步机制中,原子操作又是什么意思?希望举出一个例子最好 谢谢 等待回复
作者: vmvm555    时间: 2013-1-29 20:32
当多个线程对共享的数据进行操作时,为了保证不破坏数据的完整性应使其成为一个原子操作,所谓原子操作就是指在没有完成相关操作之前不允许其他线程打断他,否则就会破坏数据的完整性,得到错误的结果,给你举一个较为经典的例子吧关于从银行取款的问题

  1. public class MyTestBank {

  2.         public static void main(String[] args) {
  3.                 Thread t1 = new Thread(new Constomer());
  4.                 Thread t2 = new Thread(new Constomer());
  5.                 t1.start();
  6.                 t2.start();
  7.         }

  8. }

  9. class Bank {
  10.         private static int balance = 4000;
  11.         public static void getMoney(int value) {
  12.                 balance = balance - value;
  13.                 try {
  14.                         Thread.sleep(500);
  15.                 } catch (InterruptedException e) {
  16.                         // TODO Auto-generated catch block
  17.                         e.printStackTrace();
  18.                 }
  19.                 System.out.println("余额为" + balance);
  20.         }
  21. }

  22. class Constomer implements Runnable {

  23.         @Override
  24.         public void run() {
  25.                 // TODO Auto-generated method stub
  26.                 for(int i = 1; i < 12; i++) {
  27.                         Bank.getMoney(100);
  28.                 }
  29.         }       
  30. }
复制代码
余额为3800
余额为3700
余额为3600
余额为3500
余额为3400
余额为3300
余额为3200
余额为3200
余额为3000
这是运行的结果,看出问题了吧,这时只需要在public  static void getMoney(int value)改为public synchronized static void getMoney(int value)即可安全的访问共享资源(但是效率降低了),因为加上了synchronized 这个关键字,导致某个线程访问共享数据时使其成为了一个不可分的原子操作
作者: vmvm555    时间: 2013-1-30 11:58
vmvm555 发表于 2013-1-29 20:32
当多个线程对共享的数据进行操作时,为了保证不破坏数据的完整性应使其成为一个原子操作,所谓原子操作就是 ...

为什么要急着改名啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2