40-案例实现
案例实现
根据如下步骤来实现本案例。
1.创建一个 Account 类,该类下有两个 double 型的公有字段,它们分别为 amount 和 unsafeAmount 。实现构造方法来初始化其字段:
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() 方法。该方法将会在 amount 和 unsafeAmount 字段中执行10000次减法操作。用 VarHandle 对 amount 字段值执行修改操作。先用 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.最后,在控制台打印 account 和 unsafeAmount 字段值:
System.out.printf("Safe amount: %f\n", account.amount);
System.out.printf("Unsafe amount: %f\n", account.unsafeAmount);
}
}