Java8-ThreadLocal的Lambda构造方式:withInitial

ThreadLocal的Lambda构造方式

Java8中ThreadLocal对象提供了一个Lambda构造方式,实现了非常简洁的构造方法:withInitial。这个方法采用Lambda方式传入实现了 Supplier 函数接口的参数。写法如下:

代码实例

/** * 当前余额 */
private ThreadLocal<Integer> balance = ThreadLocal.withInitial(() -> 1000);

用ThreadLocal作为容器,当每个线程访问这个 balance 变量时,ThreadLocal会为每个线程提供一份变量,各个线程互不影响。

银行存款实例

附带一个银行存款的例子。

package me.zebe.cat.java.lambda;

/** * ThreadLocal的Lambda构造方式:withInitial * * @author Zebe */
public class ThreadLocalLambdaDemo {

    /** * 运行入口 * * @param args 运行参数 */
    public static void main(String[] args) {
        safeDeposit();
        //notSafeDeposit();
    }

    /** * 线程安全的存款 */
    private static void safeDeposit() {
        SafeBank bank = new SafeBank();
        Thread thread1 = new Thread(() -> bank.deposit(200), "张成瑶");
        Thread thread2 = new Thread(() -> bank.deposit(200), "马云");
        Thread thread3 = new Thread(() -> bank.deposit(500), "马化腾");
        thread1.start();
        thread2.start();
        thread3.start();
    }

    /** * 非线程安全的存款 */
    private static void notSafeDeposit() {
        NotSafeBank bank = new NotSafeBank();
        Thread thread1 = new Thread(() -> bank.deposit(200), "张成瑶");
        Thread thread2 = new Thread(() -> bank.deposit(200), "马云");
        Thread thread3 = new Thread(() -> bank.deposit(500), "马化腾");
        thread1.start();
        thread2.start();
        thread3.start();
    }

}

/** * 非线程安全的银行 */
class NotSafeBank {

    /** * 当前余额 */
    private int balance = 1000;

    /** * 存款 * * @param money 存款金额 */
    public void deposit(int money) {
        String threadName = Thread.currentThread().getName();
        System.out.println(threadName + " -> 当前账户余额为:" + this.balance);
        this.balance += money;
        System.out.println(threadName + " -> 存入 " + money + " 后,当前账户余额为:" + this.balance);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

/** * 线程安全的银行 */
class SafeBank {

    /** * 当前余额 */
    private ThreadLocal<Integer> balance = ThreadLocal.withInitial(() -> 1000);

    /** * 存款 * * @param money 存款金额 */
    public void deposit(int money) {
        String threadName = Thread.currentThread().getName();
        System.out.println(threadName + " -> 当前账户余额为:" + this.balance.get());
        this.balance.set(this.balance.get() + money);
        System.out.println(threadName + " -> 存入 " + money + " 后,当前账户余额为:" + this.balance.get());
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

本文首发于个人独立博客,文章链接:http://www.zebe.me/java-8-thread-local-lambda-with-initial

    原文作者:Zebe
    原文地址: https://blog.csdn.net/zebe1989/article/details/82692551
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞