猫头鹰的深夜翻译:Java 10的JEP 286-局部变量类型推断
前言
之前面试的时候问了我是否了解JDK10的变化,一时回答不出来,所以只回答了JDK8中的函数式编程和流编程。今天看到这篇讲JAVA10的文章,顺便了解一下。
正文
JAVA10的所有新特性请参考这里。在所有的JEP中,JEP-286在社区中引发了热烈的讨论。因此今天将介绍此特性。
在Java中,BlockingQueue接口位于java.util.concurrent包下。阻塞队列主要用来线程安全的实现生产者-消费者模型。他们可以使用于多个生产者和多个消费者的场景中。
我们可以在各种论坛和文章中找到BlockingQueue的范例。在这篇文章中,我们将介绍如何持续管理队列中的请求,以及如何在请求进入队列后立刻处理。
我们将使用单个线程管理任务放入队列的操作以及从队列中取出的操作。同时这个线程会持续的管理队列。另一个线程将用来创建BlockingQueue,它将一直运行知道服务器终止。
阻塞队列的大小可以在对象初始化的时候设置。它的大小应该基于系统堆的大小。
现在,让我们回顾创建阻塞队列的步骤以及如何持续的管理和处理请求。
这周我准备介绍一个有趣的但是很少使用的方法
按照合约编程,又称为合约编程,是一种软件设计的方法。它规定了软件设计师应该为软件组件定义正式,精确和可验证的接口规范,将常规的抽象数据类型扩展为前置条件,后置条件和不变量。这些规则被称为合约,可以比拟为商业合同中的条件和义务。
— Wikipedia
https://en.wikipedia.org/wiki/Design_by_contract
本质上它使得计算尽快的因为错误而失败。如果从假设条件开始就不满足,那么没有必要继续运行代码。
让我们使用两个银行之间的转账操作作为例子说明。以下是一些条件:
Stream是Java 8中的一个重大新功能。这个深入的教程是流支持的许多功能的介绍,并着重于简单实用的示例。
了解这个之前,你需要有对Java 8有基础的实践性的知识(lambda表达式,方法引用)
##介绍##
首先,不应该将Java 8 Streams与Java I/O流混淆(例如:FileInputStream等);它们彼此之间关联不大。
简而言之,流是对数据源的包装,使我们能够使用该数据源并对其快速便捷的批量处理。
流不存储数据,从这个意义上说,它不是一个数据结构。它也从不修改底层数据源。
java.util.stream提供的新功能支持对元素的流进行函数式编程风格的操作,比如在集合上进行map-reduce转换。
现在让我们在讨论术语和核心概念之前,深入一些简单的流创建和使用示例。
在我们深入了解CAS(Compare And Swap)策略以及它是如何在AtomicInteger这样的原子构造器中使用的,首先来看一下这段代码:
1 | public class MyApp |
这里的代码记录的访问应用的访客的数量。这段代码有问题么?如果多个线程试图更新这个数值会发生什么?事实上,这里的问题在于单单将count标记为volatile并不能保证原子性,++count也不是一个原子操作。想要了解更多请查看这里。
为什么要额外写一篇文章来研究volatile呢?是因为这可能是并发中最令人困惑以及最被误解的结构。我看过不少解释volatile的博客,但是大多数要么不完整,要么难以理解。我会从并发中最重要的一些因素开始说起:
原子性
原子性是不可分割的操作。它们要么全部实现,要么全部不实现。Java中原子操作的最佳例子是将一个值赋给变量。
可见性
可见性是指:无论是哪个线程对一个共享的变量作出的修改或是带来的影响,读其他的线程都是可见的。
有序性
有序性是指源码中指令是否会被编译器出于优化而改变执行顺序。有可能一个线程中的动作相对于另一个线程出现乱序。
最近在重拾Java网络编程,想要了解一些JAVA语言基本的实现,这里记录一下学习的过程。
网络节点(node):位于网络上的互相连通的设备,通常为计算机,也可以是打印机,网桥,路由器等等烧入网卡,从而确保没有任何两台设备的MAC地址是相同的。IP地址:网络地址,由ISP供应商决定。包交换网络(packet-switched network):数据被拆解为多个包并分别在线路上传输,每个包包含发送者和接收者的信息。协议:节点之间进行交流所遵循的规定网络分层模型:
当我们试图访问一个网站时,浏览器实际上直接访问的是本地的传输层(Transport Layer)。传输层将HTTP报文分段为TCP报文并继续向下传递给IP层。IP层封装信息并且将其传送到物理链路上。服务器对收到的数据以相反的顺序解包并读取里面的请求内容。
端口:一台计算机在传输层的每一个协议上通常有65,535个逻辑端口。HTTP通常使用80端口C/S模型:客户端与服务器模型。通常是客户端向服务器主动发送请求并等待服务器的响应。