赞
踩
Lambda表达式可以访问给它传递的变量,访问自己内部定义的变量,同时也能访问它外部的变量。
不过lambda表达式访问外部变量有一个非常重要的限制:
有同学反馈Stream循环处理集合时,可能需要操作一个中间变量进行复制或者比较操作。做了一个简单的示例如下:
会提示(封闭范围中定义的局部变量a必须是final或effectively final):
当我们加入final进行变量修饰(无法分配最终的局部变量A):
不过lambda表达式访问外部变量有一个非常重要的限制:变量不可变(只是引用不可变,而不是真正的不可变)。
AtomicInteger是一个提供原子操作的Integer类,通过线程安全的方式操作加减。
AtomicReference说明:
它是通过"volatile"和"Unsafe提供的CAS函数实现"原子操作。
1.value是volatile类型。这保证了:当某线程修改value的值时,其他线程看到的value值都是最新的value值,即修改之后的volatile的值。
2. 通过CAS设置value。这保证了:当某线程池通过CAS函数(如compareAndSet函数)设置value时,它的操作是原子的,即线程在操作value时不会被中断。
a.incrementAndGet(); //前者,先+1,再返回
a.get()//获取当前a的值
a.getAndIncrement()//后者,先返回,再 +1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。