背景

sentinel底层中的滑动窗口,使用了AtomicReferenceArray来包裹 array
组件作为底层存在,可能对话在限流的时候,

  • 1.并发高
  • 2.存在race condition
  • 3.延迟低

存在race condition的时候,我们习惯意义上会去想通过锁,但是随着线程多,会导致上下文切换,延时是不可接受

解决方案

使用AtomicReferenceArray

  1. public static void main(String[] args) {
  2. AtomicReferenceArray<String> array = new AtomicReferenceArray<>(10);
  3. for(int i = 0;i<10;i++){
  4. int finalI = i;
  5. Thread t = new Thread(()->{
  6. try {
  7. TimeUnit.SECONDS.sleep(1);
  8. } catch (InterruptedException e) {
  9. throw new RuntimeException(e);
  10. }
  11. boolean b = array.compareAndSet(1, null, "Thread index" + finalI);
  12. if (!b){
  13. System.out.println("current thread cas error"+finalI);
  14. }
  15. });
  16. t.start();
  17. }
  18. try {
  19. TimeUnit.SECONDS.sleep(2);
  20. } catch (InterruptedException e) {
  21. throw new RuntimeException(e);
  22. }
  23. System.out.println(array.get(1));
  24. }

这个array 通过cas方式,解决并发情况下的竞争