以下为部分重点摘录
前言AbstractQueuedSynchronizer在JDK1.8中还有如下图所示的众多子类:
可以看到公平锁与非公平锁,包括ReentrantLock都是在它的基础上实现的
公平锁:每个线程抢占锁的顺序为先后调用lock方法的顺序,依次获取锁。
非公平锁:每个线程抢占锁的顺序不定,谁运气好,谁就获取到锁,和调用lock方法的先后顺序无关(但因为抢占锁失败而加入到等待队列的线程不能参与下一次抢占,直到被unpark)
AQS结构AQS通过内置的FIFO同步队列来完成资源获取线程的排队工作,如果当前线程获取同步状态失败(锁)时,AQS则会将当前线程以及等待状态等信息构造成一个节点(Node)并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,则会把节点中的线程唤醒,使其再次尝试获取同步状态。
12345678910111213141516171819public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements j ...
高性能系统设计
未读原文链接
1. 前言
Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加,用户数量也在不断增加,受Web服务器的负荷和传输距离等因数的影响,响应速度慢还是经常抱怨和困扰。解决方案就是在网络传输上利用缓存技术使得Web服务数据流能就近访问,是优化网络数据传输非常有效的技术,从而获得高速的体验和品质保证。
网络缓存技术,其目的就是减少网络中冗余数据的重复传输,使之最小化,将广域传输转为本地或就近访问。互联网上传递的内容,大部分为重复的Web/FTP数据,Cache服务器及应用Caching技术的网络设备,可大大优化数据链路性能,消除数据峰值访问造成的结点设备阻塞。Cache服务器具有缓存功能,所以大部分网页对象(Web page object),如html, htm, php等页面文件,gif,tif, png, bmp等图片文件,以及其他格式的文件,在有效期(TTL)内,对于重复的访问,不必从原始网站重新传送文件实体,只需通过简单的认证(Freshness Validation)- ...
javagc
未读 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险。但是,也正因为内存管理完全由JVM负责,所以也使Java很多程序员不再关心内存分配,导致很多程序低效,耗内存。因此就有了Java程序员到最后应该去了解JVM,才能写出更高效,充分利用有限的内存的程序。
1.Java在内存中的状态首先我们先写一个代码为例子:Person.java
123456789101112package test;import java.io.Serializable;public class Person implements Serializable { static final long serialVersionUID = 1L; String name; // 姓名 Person friend; //朋友 public Person() {} public Person(String name ...
java并发教程
未读在Java类库中出现的第一个关联的集合类是 Hashtable ,它是JDK 1.0的一部分。 Hashtable 提供了一种易于使用的、线程安全的、关联的map功能,这当然也是方便的。然而,线程安全性是凭代价换来的―― Hashtable 的所有方法都是同步的。 此时,无竞争的同步会导致可观的性能代价。 Hashtable 的后继者 HashMap 是作为JDK1.2中的集合框架的一部分出现的,它通过提供一个不同步的基类和一个同步的包装器 Collections.synchronizedMap ,解决了线程安全性问题。 通过将基本的功能从线程安全性中分离开来, Collections.synchronizedMap 允许需要同步的用户可以拥有同步,而不需要同步的用户则不必为同步付出代价。
Hashtable 和 synchronizedMap 所采取的获得同步的简单方法(同步 Hashtable 中或者同步的 Map 包装器对象中的每个方法)有两个主要的不足。首先,这种方法对于可伸缩性是一种障碍,因为一次只能有一个线程可以访问hash表。 同时,这样仍不足以提供真正的线程安全性,许多 ...
nginx
未读在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络.123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108#运行用户user www-data; #启动进程,通常设置成和cpu的数量相等worker_processes 1;#全局错误日志及PID文件error_log /var/log/nginx/error.log;pid /var/run/nginx.pid;#工作模式及连接数上限events { use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linu ...
spring
未读下面我们对Spring MVC框架代码进行分析,对于webApplicationContext的相关分析可以参见以前的文档,我们这里着重分析Spring Web MVC框架的实现.我们从分析DispatcherServlet入手:
//这里是对DispatcherServlet的初始化方法,根据名字我们很方面的看到对各个Spring MVC主要元素的初始化
protected void initFrameworkServlet() throws ServletException, BeansException {
initMultipartResolver();
initLocaleResolver();
initThemeResolver();
initHandlerMappings();
initHandlerAdapters();
initHandlerExceptionResolvers();
initRequestToViewNameTranslator();
initViewResolvers() ...
我们中的许多人做事难以集中精神,但在游戏的时候却聚精会神,我们中的大部分人做事缺乏毅力,但这些人却可以坚持玩一个游戏直到天昏地暗。研究游戏设计机制以及游戏中所蕴含的心理特征有助于我们设计出更好的游戏,产品,甚至在日常生活中也能根据相应的原则激励自己,顺利达到预期目标。下面我们就分几方面来研究游戏设计机制,以及引申出来的产品设计原则。
我们中的许多人做事难以集中精神,但在游戏的时候却聚精会神,我们中的大部分人做事缺乏毅力,但这些人却可以坚持玩一个游戏直到天昏地暗。研究游戏设计机制以及游戏中所蕴含的心理特征有助于我们设计出更好的游戏,产品,甚至在日常生活中也能根据相应的原则激励自己,顺利达到预期目标。下面我们就分几方面来研究游戏设计机制,以及引申出来的产品设计原则。
1. 推搡效应。
推搡效应(Pushing effect) ,是指把商品放在目标买主够得着的地方。原本商场企图通过将领带货架放在人们容易够得着的通道旁以增加销量,但通道上的人流挤撞不但没有达到预期的效果反而降低了销量。这就是所谓的“推搡效应”引起的销量下降现象。推搡效应在网络上或者游戏上有着同样的作用。例如,游戏中游戏人物在某 ...
主要分为五部分:方法区,堆(这两块是所有线程共享的区域),程序计数器,本地方法栈,虚拟机栈(vm stack)(这三块为线程隔离区域)
程序计数器(Program Counter Register)
它是一块较小的内存空间,它的作用可以看做是当先线程所执行的字节码的信号指示器。
每一条JVM线程都有自己的PC寄存器,各条线程之间互不影响,独立存储,这类内存区域被称为“线程私有”内存(相当于每个线程一个程序计数器)
在任意时刻,一条JVM线程只会执行一个方法的代码。该方法称为该线程的当前方法(Current Method)
如果该方法是java方法,那PC寄存器保存JVM正在执行的字节码指令的地址
如果该方法是native,那PC寄存器的值是undefined。
此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域
java虚拟机的多线程是通过线程轮流切换本分配处理器处理时间的(有点不太明白,这样的话为什么还要加线程锁呢)
Java虚拟机栈(Java Virtual Machine Stack)
与PC寄存器一样,Java虚拟机 ...
最近做项目,回想起了socket,做一个小例子回顾下,长期没有使用,忘记的差不多了。
预期目标:客户端向服务器端发送消息,服务器端读取信息,回复客户端,循环往复。
server端代码:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950package com.dai.socket; import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.Scanner; /** * @Title: server.java * @Package com.dai.socket * @Description: TODO(添加描述) * @author 代长亚 * @date 2010-6-3 上午11:09:15 * @ ...
nobody wants to write the markup by hand- general-purpose XML editors are too clunky
<cards>
<card>
<name>John Doe</name>
<title>CEO, Widget Inc.</title>
<email>john.doe@widget.com</email>
<phone>(202) 456-1414</phone>
<logo url="widget.gif" />
</card>
<card>
<name>Michael Schwartzbach</name>
<title>Associate Professor</title>
<email>mi ...
