乙巳🐍年

acc8226 的博客

Java 8 之后推出的 Lambda 表达式开启了 Java 语言支持函数式编程(Functional Programming)的新时代。

Lambda 表达式,也称为闭包(Closure),现在很多语言都支持 Lambda 表达式,如 C++、C#、Swift、Objective-C 和 JavaScript 等。为什么 Lambda 表达式这怎么受欢迎,这是因为 Lambda 表达式是实现支持函数式编程技术基础。

函数式编程与面向对象编程有很大的差别,函数式编程将程序代码看作数学中的函数,函数本身作为另一个函数的参数或返回值,即高阶函数。而面向对象编程是按照真实世界客观事物的自然规律进行分析,客观世界中存在什么样的实体,构建的软件系统就存在什么样的实体。即便 Java 8 之后提供了对函数式编程的支持,但是 Java 还是以面向对象为主的语言,函数式编程只是对 Java 语言的补充。

Lambda 表达式概述

简单来说,Lambda 表达式是创建匿名内部类的语法糖(syntax sugar)。在编译器的帮助下,可以让开发人员用更少的代码来完成工作。

Lambda 表达式标准语法形式如下:

1
2
3
(参数列表) -> {
//Lambda表达式体
}
阅读全文 »

Java 程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

栈内存

  • 用于存储局部变量,当数据使用完,所占空间会自动释放

堆(heap)内存

  • 数组和对象,通过 new 建立的实例都存放在堆内存中。
  • 每一个实体都有内存地址值
  • 实体中的变量都有默认初始化值
  • 实体不在被使用,会在不确定的时间内被垃圾回收器回收
阅读全文 »

ThreadLocal

ThreadLocal 是 JDK 包提供的,它提供了线程本地变量,也就是如果你创建了一个 ThreadLocal 变量,那么访问这个变量的每个线程都会有这个变量的一个本地副本。当多个线程操作这个变量时,实际操作的是自己本地内存里面的变量,从而避免了线程安全问题。创建一个 ThreadLocal 变量后,每个线程都会复制一个变量到自己的本地内存。

InheritableThreadLocal

InheritableThreadLocal 继承自 ThreadLocal,其提供了一个特性,就是让子线程可以访问在父线程中设置的本地变量。

CountDownLatch

CountDownLatch 类位于 java.util.concurrent 包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用 CountDownLatch 来实现这种功能了。

CountDownLatch 类只提供了一个构造器:
public CountDownLatch(int count) { }; //参数count为计数值
然后下面这 3 个方法是 CountDownLatch 类中最重要的方法:

  • public void await() throws InterruptedException { }; // 调用 await()方法的线程会被挂起,它会等待直到count值为0才继续执行
  • public boolean await(long timeout, TimeUnit unit) throws InterruptedException { }; //和await()类似,只不过等待一定的时间后 count 值还没变为 0 的话就会继续执行
  • public void countDown() { }; //将count值减1
阅读全文 »
0%