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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冉世友 中级黑马   /  2013-1-7 17:52  /  1166 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

张老师演示Semaphore同步工具的代码里,有一段输出说是要合成原子单元才不会出问题,
我在网上各种查还是不会啊,大神来指点下吧。

就是这里29行:

//下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元
System.out.println("线程" + Thread.currentThread().getName() +
"已离开,当前已有" + (3-sp.availablePermits()) + "个并发");
  1. package cn.itcast.heima2;

  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;
  4. import java.util.concurrent.Semaphore;

  5. public class SemaphoreTest {
  6.         public static void main(String[] args) {
  7.                 ExecutorService service = Executors.newCachedThreadPool();
  8.                 final  Semaphore sp = new Semaphore(3);
  9.                 for(int i=0;i<10;i++){
  10.                         Runnable runnable = new Runnable(){
  11.                                         public void run(){
  12.                                         try {
  13.                                                 sp.acquire();
  14.                                         } catch (InterruptedException e1) {
  15.                                                 e1.printStackTrace();
  16.                                         }
  17.                                         System.out.println("线程" + Thread.currentThread().getName() +
  18.                                                         "进入,当前已有" + (3-sp.availablePermits()) + "个并发");
  19.                                         try {
  20.                                                 Thread.sleep((long)(Math.random()*10000));
  21.                                         } catch (InterruptedException e) {
  22.                                                 e.printStackTrace();
  23.                                         }
  24.                                         System.out.println("线程" + Thread.currentThread().getName() +
  25.                                                         "即将离开");                                       
  26.                                         sp.release();
  27.                                         //下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元
  28.                                         System.out.println("线程" + Thread.currentThread().getName() +
  29.                                                         "已离开,当前已有" + (3-sp.availablePermits()) + "个并发");                                       
  30.                                 }
  31.                         };
  32.                         service.execute(runnable);                        
  33.                 }
  34.         }

  35. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
金鑫 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
焦健 来自手机 高级黑马 2013-1-9 08:59:21
沙发
这个是高新技术里面的么来自: Android客户端
回复 使用道具 举报
焦健 发表于 2013-1-9 08:59
这个是高新技术里面的么

不是,应该是多线程的视频
回复 使用道具 举报
郑传庆 发表于 2013-1-9 09:13
不是,应该是多线程的视频

哦,知道了,谢版主,有时间我找找看一下。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马