为什么这种方法不同步?

克雷帕姆

我创建了一个REST控制器(在Spring Boot 2.2.2中),该控制器调用“ Invokable”服务类,如下所示:

@RestController
@RequestMapping("service")
public class ServiceController {

    private Set<Invokable> services;

    @Autowired
    public ServiceController(Set<Invokable> services) {
        this.services = services;
    }

    @GetMapping("invoke/{service}")
    public void invoke(@PathVariable("service") String service) throws InterruptedException {
        val invokable = services.stream().filter(c -> AopUtils.getTargetClass(c).getName().equals(service)).findFirst();
        invokable.get().invoke();
    }
}

所述Invokable接口方法被标记Async

public interface Invokable {

    @Async("taskExecutor")
    void invoke();
}

其中一种实现如下所示:

@Service
@Transactional
public class EventListener implements Invokable {

    private static boolean RUNNING = false;

    private EventService eventService;

    private List<EventProcessor> processors;

    @Autowired
    public EventListener(EventService eventService,
                         List<EventProcessor> processors) {
        this.eventService = eventService;
        this.processors = processors;
    }

    @Override
    public void invoke() {
        if (!RUNNING) {

            RUNNING = true;

            [...]

            RUNNING = false;
        }
    }
} 

在上面可以看到,我通过使用RUNNINGboolean 锁定方法来实现了自定义同步机制这很好用,但是我不想自己实现。

之前,我曾尝试(通过lombok):

@Override
@Synchronized
public void invoke() {
  ...
}

@Override
public synchronized void invoke() {
  ...
}

@Override
public void invoke() {
  synchronized(this) {
    ...
  }
}

但是,以上所有内容似乎允许同时调用该方法。

我想念过什么synchronized用吗?是否有一种更清洁的方法可以实现上述目标而无需自己实施该机制?

JB Nizet:

synchronized防止并发调用。但这并不意味着在运行时进行的调用将被丢弃并被忽略。这意味着它将阻塞,等待直到上一个完成,然后再执行。

您的代码不同步任何内容。它仅忽略运行时进行的调用,这是非常不同的。它以一种非线程安全的方式进行操作:同时调用该方法的两个独立线程可能会看到布尔值相同,并且都同时执行该方法。更糟糕的是:在一个线程中对布尔值所做的更改可能在另一个线程中不可见。

您将需要正确地使用AtomicBoolean以线程安全的方式执行操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么不同步?

为什么StringBuffer的readObject不同步?

为什么async / await在forEach循环中不同步ioredis get方法执行?

为什么php的$_COOKIE不同步读取cookies?

HashMap不同步,那么为什么并发修改异常

为什么rsync不同步该文件?

为什么角度不同步我的 var 绑定与 ngModel?

为什么Hashmap不同步,为什么Hashmap在内部实现Hashtable(已同步)。

为什么不等待这种方法?

将2种方法与另一种方法同步,但彼此不同步

使静态方法同步或不同步

为什么我的 StringBuffer 变量不同步。其中 StringBuilder 变量表现为同步

(Java)如果不同步,为什么允许HashSet同步使用?

为什么我用这个不同步的代码反复得到相同的结果?

为什么 NSUserDefaults 备份到 iCloud 但不同步所有设备?

为什么gpedit和相应的注册表项不同步?

为什么新的SkyDrive客户端不同步我的所有内容?

为什么不同步会使ArrayList更快,更不安全?

为什么 Angular 不同步具有相同 formControlName 的字段?

为什么仍然存在“命令不同步;您现在无法运行此命令”错误

为什么等时d3转换不同步?

Redux:无法弄清楚为什么ownProps与状态不同步

为什么 SCNRenderer 在绘制到 OpenGL 上下文时如此不同步/滞后?

PouchDb 与 CouchDb 不同步......为什么复制不解决它?

为什么Vue和我的DOM Textarea不同步(不是反应性问题)?

为什么 Bootstrap 3 折叠与双击复选框状态不同步?

为什么我的 mp4 文件的音频不同步

为什么服务器和客户端不同步?(python套接字)

为什么我的按钮与我的 onclick 事件不同步?