java线程中的semaphore 的release方法和别的代码不能同步 10

ExecutorServiceservice=Executors.newCachedThreadPool();//创建一个可根据需要创建新线程的线程池,但是在以前构造的线... ExecutorService service = Executors.newCachedThreadPool();//创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。 final Semaphore sp = new Semaphore(3);// 只能3个线程同时访问 //模拟10个客户端访问 Runnable runnable = new Runnable(){ @Override public void run() { try { sp.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程"+ Thread.currentThread().getName()+"进入,当前已有"+(3-sp.availablePermits())+"个并发"); try { Thread.sleep((long)(Math.random()*1000)); } catch (InterruptedException e) { e.printStackTrace(); } synchronized(SemaphoreTest.class){ System.out.println("线程"+ Thread.currentThread().getName()+"即将离开"); sp.release(); //下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元 System.out.println("线程" + Thread.currentThread().getName() + "已离开,当前已有" + (3-sp.availablePermits()) + "个并发"); } } }; for(int i=0;i<10;i++){ service.execute(runnable); } // 退出线程池 service.shutdown();
各位注意了我是说synchronized没有用处,这个是什么原因引起的,结果:
线程pool-1-thread-9已离开,当前已有3个并发
线程pool-1-thread-6即将离开
线程pool-1-thread-10进入,当前已有3个并发
线程pool-1-thread-6已离开,当前已有3个并发
为什么6还没有离开,10就进来了,同步不起作用,why?????
展开
 我来答
pieryon
2014-10-20 · 知道合伙人数码行家
pieryon
知道合伙人数码行家
采纳数:14411 获赞数:166867
获取软件设计师高级职称 万达金融最佳创新奖

向TA提问 私信TA
展开全部
你好,你用final Semaphore sp = new Semaphore(3,true); 注意这个一定要加true这个参数哦
这样就可以保持同步了
chengjiansun
2014-10-20
知道答主
回答量:17
采纳率:0%
帮助的人:4.6万
展开全部
同求解答,我也遇到这种问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
oooo______ooo
2014-10-20
知道答主
回答量:16
采纳率:0%
帮助的人:10.4万
展开全部
用Lock的写锁解决
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式