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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 张向辉 于 2013-1-30 11:57 编辑

在Java语言中线程同步? 在同步机制中,原子操作又是什么意思?希望举出一个例子最好 谢谢 等待回复

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

2 个回复

倒序浏览
当多个线程对共享的数据进行操作时,为了保证不破坏数据的完整性应使其成为一个原子操作,所谓原子操作就是指在没有完成相关操作之前不允许其他线程打断他,否则就会破坏数据的完整性,得到错误的结果,给你举一个较为经典的例子吧关于从银行取款的问题

  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 这个关键字,导致某个线程访问共享数据时使其成为了一个不可分的原子操作

点评

请尽快申请下改名,如果已经申请,暂时还没有得到解决,先在真实资料备注下姓名。  发表于 2013-1-30 11:56

评分

参与人数 2技术分 +1 黑马币 +9 收起 理由
张文 + 1
Rancho_Gump + 9

查看全部评分

回复 使用道具 举报
vmvm555 发表于 2013-1-29 20:32
当多个线程对共享的数据进行操作时,为了保证不破坏数据的完整性应使其成为一个原子操作,所谓原子操作就是 ...

为什么要急着改名啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马