2分钟学习ThreadLocal的Lambda构造方式

简介: 2分钟学习ThreadLocal的Lambda构造方式

ThreadLocal的Lambda构造方式

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

代码实例

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

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

银行存款实例

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

package com.javapub.source.code.threadlocal;

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

    /**
     * 运行入口
     *
     * @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), "p哥");
        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();
        }
    }
}

来源:https://zebe1989.blog.csdn.net/

我是 JavaPub,三观很正,乐于创业,喜欢烹饪。今年已近年中,各位小伙伴一定已经拿到自己心仪的offer,但是不要忘记进步,共勉!

目录
相关文章
|
6月前
|
存储 安全 Java
|
6月前
|
Rust Java Serverless
函数与方法的区别
函数与方法的区别,当然是有区别。 不管是java、rust还是go,他们都是不一样的。
58 1
|
6月前
|
算法 Java 测试技术
简介Object类+接口实例(深浅拷贝、对象数组排序)
简介Object类+接口实例(深浅拷贝、对象数组排序)
|
12月前
|
Java
lambda表达式操作map
lambda表达式操作map
|
前端开发 Java 程序员
多线程的创建,复习匿名内部类,Thread的一些方法,以及lambda的变量捕捉,join用法(一)
多线程的创建,复习匿名内部类,Thread的一些方法,以及lambda的变量捕捉,join用法
|
程序员 调度
多线程的创建,复习匿名内部类,Thread的一些方法,以及lambda的变量捕捉,join用法(二)
多线程的创建,复习匿名内部类,Thread的一些方法,以及lambda的变量捕捉,join用法
|
存储 Java 数据库
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(中)
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(中)
63 1
|
6月前
|
存储 Java 开发者
HashMap构造函数解析与应用场景
HashMap构造函数解析与应用场景
|
6月前
|
Python
Python函数式编程,map(), filter() 和 reduce() 函数的作用是什么?
Python函数式编程,map(), filter() 和 reduce() 函数的作用是什么?
66 4
|
6月前
|
JavaScript 前端开发 Java
函数和方法有区别吗?
函数和方法有区别吗?
66 0