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);
}
}