返回信息流两个线程进入Semaphore,如下:
semp.acquire();
System.out.println("Accessing ");
semp.release();
请问,有没有可能打印AcceAccessing ssing ,也就是说进入信号量中的线程是互斥的吗?
这是一条镜像帖。来源:北邮人论坛 / java / #52462同步于 2016/8/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
java并发库Semaphore问题?
dinghongkai
2016/8/17镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
初始值为1的Semaphore可以当(非reentrant的)锁用,但Semaphore不仅限于这一种用法。https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html
信号量只是影响线程的run/block,不会影响线程内部的执行,信号量定义上限5,被各个线程acquire掉5个之后,新的调用acquire的线程会阻塞,知道有其他线程释放(release).
println JDK的实现源码用了synchronized同步锁,类似原子操作,不会因为多线程环境就发生输出隔断。
【 在 Tinystone 的大作中提到: 】
: 信号量只是影响线程的run/block,不会影响线程内部的执行,信号量定义上限5,被各个线程acquire掉5个之后,新的调用acquire的线程会阻塞,知道有其他线程释放(release).
: println JDK的实现源码用了synchronized同步锁,类似原子操作,不会因为多线程环境就发生输出隔断。
查了下,没找到说println是原子的或者是加过synchronized,可能之前没太关注吧,谢谢!
看源码就知道了
【 在 dinghongkai (CU) 的大作中提到: 】
: 查了下,没找到说println是原子的或者是加过synchronized,可能之前没太关注吧,谢谢!
Semaphore初始的permit是2个,存在多线程并发,比如你的例子,2个线程同时进行,各自调用System.out.println(XX); 这上面正如楼上说的,是在PrintStream上的内置的互斥锁,因此乖乖的打印了两行。
如果permit是1个,那么更没有什么问题了,在semaphore的时候,第一个线程执行中,第二个线程是处于挂起WAITING状态,等待这第一个线程释放锁,然后重新唤醒进入RUNNABLE状态,等待JVM调度再执行。