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????? 展开
各位注意了我是说synchronized没有用处,这个是什么原因引起的,结果:
线程pool-1-thread-9已离开,当前已有3个并发
线程pool-1-thread-6即将离开
线程pool-1-thread-10进入,当前已有3个并发
线程pool-1-thread-6已离开,当前已有3个并发
为什么6还没有离开,10就进来了,同步不起作用,why????? 展开
3个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询