Springboot 几种线程同步处理

2019-10-18  本文已影响0人  crMiao

1.synchronized关键词

a.synchronized关键字修饰方法

由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。

  public synchronized void demo(){
    ......
  }

b.synchronized关键字修饰静态方法

此时如果调用该静态方法,将会锁住整个类

c.synchronized关键字修饰语句块

被修饰的语句块会自动被加上内置锁实现同步

  synchronized(object){
    ......
  }
  lock.lock();
    try {
      System.out.println("已锁住");
      for (int i = 0; i < 10; i++) { // 放大代码块执行完成的时间,便于观察
      System.out.println(i);
      try {
        System.out.println(Thread.currentThread().getName() + "休眠5秒!");
        Thread.sleep(5000);// 放大代码块执行完成的时间,便于观察
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  } finally {
    lock.unlock();
    System.out.println("解锁");
  }

当公共资源被占用时,其它线程必须等待资源被释放后才能执行,这种场景适用于对数据库的操作,保证其数据的原子性。

2.Semaphore并发包

Semaphore是基于计数的信号量,它可以设定一个资源的总数量,基于这个总数量,多线程竞争获取许可信号,做自己的申请后归还,超过总数量后,线程申请许可,信号将会被阻塞。等到有资源时,继续执行。

下面在springboot中实现:

 @Contorller
 public class Controller(){
 Semaphore semaphore=new Semaphore(1);  //定义资源的总数量
    @GetMapping("/userInfo/request")
    @ResponseBody
    public String Resquest(){
        int availablePermits=semaphore.availablePermits();//可用资源数
        if(availablePermits>0){
            System.out.println("抢到资源");
        }else{
            System.out.println("资源已被占用,稍后再试");
            return "Resource is busy!";
        }
        try {
            semaphore.acquire(1);  //请求占用一个资源
            System.out.println("资源正在被使用");
            Thread.sleep(30000);//放大资源占用时间,便于观察
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            semaphore.release(1);//释放一个资源
        }
        return "Success";
    }
 }

当有多个线程同时请求资源时,效果如下:
先获得资源的线程会在30秒之后显示success,后面请求的线程会直接返回

上一篇 下一篇

猜你喜欢

热点阅读