Crab213's Blog.

Crab213's Blog.

A monad is just a monoid in the category of endofunctors.

Java并发编程实践笔记6:线程池的应用

任务与执行策略的隐式耦合我们心目中的理想任务模型是任务之间是相互独立的,这样每个任务就可以独立执行。因此执行这样的任务的线程池的执行策略和任务直接是没有耦合的。我们可以任意选择执行策略,线程池中线程的数目也不受任何制约。 但是实际中还是有很多任务不是互相独立的,或者有其他特殊需求,这就会使任务和其执行策略有所联系,不是完全独立的。 非独立任务。某个任务可能会依赖其他任务的执行结果,或者起执行后发生的副作用。这样的任务会造成活性(liveness)问题,会限制线程池的大小。 使用了线程封闭的线程。使用线程封闭从而避免同步的线程自然而然需要顺序执行。即必须使用单线程的线程池。 使用Thre...

Java并发编程实践笔记5:取消与关闭

大多数情况下我们想让线程中的任务被完整执行,但是还是有例外的情况。对于有些任务,我们可能在它执行完毕之前就可能会发现它的结果已经不需要了,这时我们就希望有能提前终止任务的手段。在java中想要安全快速可靠地终止一个任务不适什么容易的事情,java语言本身没有提供安全地让线程强制停止的手段。相反,它提供了一种协同机制,让一个线程请求另一个线程,让其停止它所做的事情。 任务取消(Task Cancellation)如果一个外部代码让一个活动提前结束,我们称这个活动是可以取消的。有很多原因会导致我们想要取消一个活动: 用户请求取消。比如应用程序的用户需要让程序取消某一操作。 时限。有些操作可...

Java并发编程实践笔记4:任务执行

任务(task)是一个独立且彼此互不干涉的单元。在设计并发应用程序时,将程序划分成任务往往会简化程序结构,并且提供一个并行执行的自然子结构。 在线程中执行任务任务是独立的,并且不依赖于其他任务的状态,执行结果或者副作用。我们可以在线程中执行任务。我们有多种任务执行策略。 顺序执行所有任务 为每一个任务分配一个线程 使用固定数量的线程来执行所有任务 方案一就是在一个线程中一个一个的执行所有任务,缺点显而易见。所有任务顺序执行,没有很好的利用多处理器,其缺点与单线程程序是一样的。方案二是很多人一拍脑袋就能想出来的,但是也是有明显缺点的。我们不能控制线程的数目,线程数目可以无限大,这就可能...

Java并发编程实践笔记3:构建对象

我们不可能总是从头设计自己的程序,java语言本身提供了许多模块来帮助我们构建线程安全的多线程程序。 设计一个线程安全的类使用封装可以简化我们的工作,依靠良好的封装,我们可以更简单地确定一个类是否线程安全,或更更改一个线程安全的类。设计一个线程安全的类一般分为三步: 找出那些组成这个类状态的变量 找出那些约束状态变量的不变式 建立一种管理并发操作对象状态的机制 我们必须注意约束这个类的状态的不变式,一切同步行为都是以不变式为准。如果对一个变量的操作会违反不变式,造成类进入一个非法的状态,我们就应该将这个操作封装起来然后加以同步。如果不了结一个对象的不变式,那么你就无法保证线程安全。对...

Java并发编程实践笔记2:对象共享

写出正确的并发程序的关键问题就是管理对线程共享的可变状态的操作。我们需要处理两个问题:原子性和可视性。 可视性(visibility)问题当一个单线程程序执行的时候,我们自然而然认为我们对内存的操作是连贯的。比如,我们对一个变量x赋值,当我们紧接着这个赋值语句读取这个变量的值的时候,我们自然而然的认为这个x的值就是我们上一条赋值语句赋给他的值,但这在多线程环境下是行不通的。在多线程环境下,没有同步机制,我们无法确保在其他线程更改的状态能被当前线程立刻看到,这个操作已经不能基于简单的时序模型。如果一个线程在某个时刻改变了一个共享的状态,那么在这个时刻之后其他线程读取的这个状态值是无法保证被...

Java并发编程实践笔记1:线程安全基础

线程的优点现代计算机通常都有多个处理器。线程作为大多数操作系统的调度单位可以有效提升计算机的处理效率。在处理阻塞IO的问题上线程更加占有优势,当IO阻塞时,被阻塞的线程等待,其他线程可以继续执行,相互不影响。 线程可以简化程序的模型。当我们将所有操作放在同一个进程中时,程序的模型会变得及其复杂。我们必须在同一个进程中处理所有的事务。这就意味着我们不能轻易的让进程阻塞,必须要使用非阻塞IO。同时,我们需要在进程中处理多个任务,而经验告诉我们,一个进程处理一个事情会使程序简化,不易出错。 线程允许我们写出相应速度更快的UI。我们可以将UI的事件处理放在同一个线程中,将其他任务放在其它线程中,...

TCP/IP详解阅读笔记5:TCP心跳机制

根据TCP的实现机制,只要TCP协议的两端不出现重启,或者更换IP地址,并且不关闭TCP连接的话,TCP连接就会一直维持,至少原理上是这样。TCP连接在双方都处于闲置状态时,TCP两端不会发送接受任何信息。但是有些情况下,我们是需要知道对面是否关闭或者丢失了连接,或者我们想要保持一个最小限度的连接流,哪怕TCP两端实际上没有需要交换的数据。TCP心跳(keepalive)机制提供了这样的功能。TCP心跳机制提供了一种在不干扰正常通讯内容前提下检测网络另一头的方法。它控制一个心跳检测定时器,每当定时器到时时,发出一个心跳检测,接受端收到这个检测时,会发回一个ACK。 TCP心跳机制是一个很...

TCP/IP详解阅读笔记6:TCP超时与重发

TCP重发机制TCP协议在IP层之上实现了正确有序地发送数据。为了实现这个目的,每当TCP协议意识到有数据丢失时,他会重新发送数据。这种重发有两种不同的机制来实现。 基于超时的重发TCP在发送数据的时候设置一个定时器,当定时器到时时,如果对面还没有发过来确认信息表明这个段被正确接收时,TCP就会重新发送这个段。这个定时器设定的时间被称作重发时限(RTO, retransmission timeout)。另一个重要的名词是往返时间(RTT, round-trip time)。每当TCP重发时限到了之后并且没有收到ACK后,TCP会重新发送这个段,并且把RTO设置成为原来的两倍,以此类推。实...

TCP/IP详解阅读笔记3:TCP流量控制

大块数据和交互数据大块数据(bulk data)是指大包的数据,通常达到了TCP段数据传送的上限。交互数据(interactive data)是指交互程序产生的数据包,例如ssh,telnet,以及即时通讯软件,通常这样数据非常零碎,数目巨大。交互数据非常浪费网络带宽,因为其传输效率低下。比如如果一个TCP段只发送一字节的数据,那么此时TCP头至少20字节,IP头至少20字节,发生了严重的浪费,占用的大量的带宽,这就是所谓的小包问题。 ACK延迟很多情况下TCP并不为每一个包发送一个ACK,因为ACK是累加性的,所以对多个包可以只发送一个ACK。因为减少了ACK的数量,所以这样做提高了网...

TCP/IP详解阅读笔记2:TCP连接管理

TCP连接建立TCP与UDP不同,是基于连接的协议,而UDP是俗称的数据报协议。TCP最大的不同是有连接,是有内部状态的协议。为了建立正确的连接,需要特定机制确定连接的参数及其状态。这些状态中最基本的包括连接双方的序列数(sequence number),窗口大小,以及双方能够接受的最大段长度(maximum segment size, MMS)。因此建立一个TCP连接需要进行一些约定好的步骤,也就是俗称的“三次握手”。 第一次握手TCP连接需要一个发起人,成为客户端(client),响应的另一方称之为服务端(server)。发起连接时,客户端向服务端发送一个SYN段(就是TCP头中FL...
crab2313
slave get your ass back here ♂.
FRIENDS
friendA friendB