Semaphore有什么作用

2021-11-29 20:08发布

17条回答
猫的想法不敢猜
2021-12-29 11:03

Semaphore也是一个线程同步的辅助类,可以限制当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
 
import static java.util.concurrent.TimeUnit.MICROSECONDS;
 
@SpringBootTest(classes = GoodsApplication.class)
@RunWith(SpringRunner.class)
public class TestIdWorker {
 
    @Autowired
    private SpuMapper spuMapper;
    
    
//J.U.C并发编程 限制访问线程数量
    private final static Semaphore semaphore = new Semaphore(1);
 
    @Test
    public void testCyclicBarrier() throws Exception{
        //J.U.C并发编程 栅栏机制
        CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
        for (int i = 0; i < 5; i++) {
            new Thread(()->{
                try {
                    System.out.println("我已经进来啦,查询商品");
                    cyclicBarrier.await(); //等待,栅栏拦住线程,等待栅栏开启,2000线程执行此段代码
                    Spu spu = findById("1335518444044419072");
                    if (spu!=null){
                        System.out.println("已经查到商品啦,商品名"+spu.getName());
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
 
            }).start();
        }
        System.in.read(); //不关闭程序
    }
 
    Spu findById(String id) throws Exception{
        try {
            boolean b = semaphore.tryAcquire(3000, MICROSECONDS); //等待,如果三毫秒内没有拿到令牌,返回false
            if (b == false){
                System.out.println("很遗憾,没拿到令牌");
                return null;
            }
            Spu spu = spuMapper.selectByPrimaryKey(id);
            return spu;
        }finally {
            semaphore.release();
        }
    }
}


一周热门 更多>