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,但是不要忘记进步,共勉!