Skip to content

AtomicMarkableReference 不能解决ABA问题 #626

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