Skip to content

AtomicMarkableReference 不能解决ABA问题 #626

Closed
@itmaaa

Description

@itmaaa

/**

  • AtomicMarkableReference则是将一个boolean值作是否有更改的标记,本质就是它的版本号只有两个,true和false,

  • 修改的时候在这两个版本号之间来回切换,这样做并不能解决ABA的问题,只是会降低ABA问题发生的几率而已

  • @author : mazh

  • @Date : 2020/1/17 14:41
    */
    public class SolveABAByAtomicMarkableReference {
    private static AtomicMarkableReference atomicMarkableReference = new AtomicMarkableReference(100,false);

    public static void main(String[] args) {

     Thread refT1 = new Thread(() -> {
         try {
             TimeUnit.SECONDS.sleep(1);
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
         atomicMarkableReference.compareAndSet(100, 101, atomicMarkableReference.isMarked(), !atomicMarkableReference.isMarked());
         atomicMarkableReference.compareAndSet(101, 100, atomicMarkableReference.isMarked(), !atomicMarkableReference.isMarked());
     });
    
     Thread refT2 = new Thread(() -> {
         boolean marked = atomicMarkableReference.isMarked();
         try {
             TimeUnit.SECONDS.sleep(2);
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
         boolean c3 = atomicMarkableReference.compareAndSet(100, 101, marked, !marked);
         System.out.println(c3); // 返回true,实际应该返回false
     });
    
     refT1.start();
     refT2.start();
    

    }
    }

个人理解是这样,不知是否正确?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions