当前位置:嗨网首页>书籍在线阅读

40-案例实现

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

案例实现

根据如下步骤来实现本案例。

1.创建一个 Account 类,该类下有两个 double 型的公有字段,它们分别为 amountunsafeAmount 。实现构造方法来初始化其字段:

public class Account {
  public double amount;
  public double unsafeAmount;
  public Account() {
    this.amount=0;
    this.unsafeAmount=0;
  }
}

2.创建一个 Decrementer 类并实现 Runnable 接口。它有一个私有类型的 Account 字段初始化于构造方法中:

public class Decrementer implements Runnable {
  private Account account;
  public Decrementer(Account account) {
    this.account = account;
  }

3.实现 run() 方法。该方法将会在 amountunsafeAmount 字段中执行10000次减法操作。用 VarHandleamount 字段值执行修改操作。先用 MethodHandles 类的 lookup 方法来获取它,然后用 getAndAdd() 方法来修改该字段值。用=操作符来修改 unsafeAmount 字段:

@Override
public void run() {
  VarHandle handler;
  try {
    handler = MethodHandles.lookup().in(Account.class)
                .findVarHandle(Account.class, "amount",
                double.class);
    for (int i = 0; i < 10000; i++) {
      handler.getAndAdd(account, -100);
      account.unsafeAmount -= 100;
    }
  } catch (NoSuchFieldException | IllegalAccessException e) {
    e.printStackTrace();
  }
}

4.实现一个 Incrementer 类。这与 Decrementer 类相同,但它会增加 account 的值。该类的源代码将不会在这展示。

5.最后,实现 Main 类的 main() 方法。首先,创建一个 account 对象:

public class Main {
  public static void main(String[] args) {
    Account account = new Account();

6.然后,创建一个线程来执行一个 Incrementer 任务,以及创建另一个线程来执行一个 Decrementer 任务。启动它们并用 join() 方法来等待它们执行完成:

Thread threadIncrementer = new Thread(new Incrementer(account));
Thread threadDecrementer = new Thread(new Decrementer(account));
threadIncrementer.start();
threadDecrementer.start();
try {
  threadIncrementer.join();
  threadDecrementer.join();
} catch (InterruptedException e) {
  e.printStackTrace();
}

7.最后,在控制台打印 accountunsafeAmount 字段值:

    System.out.printf("Safe amount: %f\n", account.amount);
    System.out.printf("Unsafe amount: %f\n", account.unsafeAmount);
  }
}