- 浏览: 58009 次
最新评论
文章列表
1. 无 锁类 的原理 详 解
1.1.CAS
CAS算法的过程是这样:它包含3个参数CAS(V,E,N)。V表示要更新的变量,E表示预期值,N表示新值。仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。最后,CAS返回当前V的真实值。CAS操作是抱着乐观的态度进行的,它总是认为自己可以成功完成操作。当多个线程同时使用CAS操作一个变量时,只有一个会胜出,并成功更新,其余均会失败。失败的线程不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。基于这样的原理,CAS操作即时没有锁,也可以 ...
1. 什么是设计模式
在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题 ,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领 域引入到计算机科学的。 ...
1. 线程池的基本使用
1.1.为什么需要线程池
平时的业务中,如果要使用多线程,那么我们会在业务开始前创建线程,业务结束后,销毁线程。但是对于业务来说,线程的创建和销毁是与业务本身无关的,只关心线程所执行的任务。因此希望把尽可能多的cpu用在执行任务上面,而不是用在与业务无关的线程创建和销毁上面。而线程池则解决了这个问题,线程池的作用就是将线程进行复用。
1.2.JDK为我们提供了哪些支持
JDK中的相关类图如上图所示。
其中要提到的几个特别的类。
Callable类和Runable类相似,但是区别在于Callable有返回值。
ThreadPoolEx ...
1. 各种同步控制工具的使用
1.1 ReentrantLock
ReentrantLock感觉上是synchronized的增强版,synchronized的特点是使用简单,一切交给JVM去处理,但是功能上是比较薄弱的。在JDK1.5之前,ReentrantLock的性能要好于synchronized,由于对JVM进行了优化,现在的JDK版本中,两者性能是不相上下的。如果是简单的实现,不要刻意去使用ReentrantLock。相比于synchronized,ReentrantLock在功能上更加丰富,它具有可重入、可中断、可限时、公平锁等特点。
首先我们通过一个例子来说明 ...
jvm常用命令以及问题总结
- 博客分类:
- JVM
JVM监控和诊断概述
程序运行中经常会遇到各种问题,定位问题时通常需要综合各种信息,如系统日志、堆dump文件、线程dump文件、GC日志等。通过虚拟机监控和诊断工具可以帮忙我们快速获取、分析需要的数据,进而提高问题解决速度。可以使用图形化工具如:jconsole,jvisualvm,或者命令进行监控和诊断命令。 本文将介绍虚拟机常用监控和问题诊断命令工具的使用方法,主要包含以下工具:
jps
显示系统中所有Hotspot虚拟机进程
jstat
收集Hotspot虚拟机各方面运行数据
jstack
显示虚拟机的线程栈信息
jinfo
显示虚拟 ...
happen-before 规则
- 博客分类:
- 并发
Happen-Before规则
程序顺序原则:一个线程内保证语义的串行性
volatile规则:volatile变量的写,先发生于读,这保证了volatile变量的可见性
锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
传递性:A先于B,B先于C,那么A必然先于C
线程的start()方法先于它的每一个动作
线程的所有操作先于线程的终结(Thread.join())
线程的中断(interrupt())先于被中断线程的代码
对象的构造函数执行结束先于finalize()方法
java并发特性,原子性、有序性、可见性
happen-before规则
无锁编程(CAS)
JDK并发编程1
JDK并发编程2
java并发特性,原子性、有序性、可见性
- 博客分类:
- 并发
原子性是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其它线程干扰。
Java中的原子操作包括:
1)除long和double之外的基本类型的赋值操作
2)所有引用reference的赋值操作
3)java.concurrent.Atomic.* 包中所有类的一切操作。
但是java对long和double的赋值操作是非原子操作!!long和double占用的字节数都是8,也就是64bits。在32位操作系统上对64位的数据的读写要分两步完成,每一步取32位数据。这样对double和long的赋值操作就会有问题:如果有两个线程同时写一个变量内 ...
1.选择执行shell出错
远程执行shell时候找不到java环境变量
glassfish@ubuntu:~$ ssh -l glassfish 192.168.0.153 "/home/glassfish/test.sh"
glassfish@192.168.0.153's password:
/opt/lib/glassfish4.1/bin/asadmin: 52: exec: java: not found
/opt/lib/glassfish4.1/bin/asadmin: 52: exec: java: not found
...
基于Jersey的RESTful学习
- 博客分类:
- RESTful
Jersey与Spring整合依赖的jar
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring3</artifactId>
<version>${jersey.version}</version>
<exclusions> <!-- 移除jersey自己的spring库 -->
<exclusi ...
多字段精确查询 MultiFieldQueryParser使用
Analyzer analyzer = new StandardAnalyzer();
reader=DirectoryReader.open(directory);
searcher=new IndexSearcher(reader);
//对应的字段
String[] fields = { CommonVars.FILE_ARCHIVE_CATEGORY_ENUM ,CommonVars.FILE_NAME, CommonVars.FILE_BELONGYEAR, CommonVars.FI ...
官方JVM参数地址
http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp
本文主要内容:
Trace跟踪参数
堆的分配参数
栈的分配参数
在IDE的后台打印GC日志:
既然学习JVM,阅读GC日志是处理Java虚拟机内存问题的基础技能,它只是一些人为确定的规则,没有太多技术含量。
既然如此,那么在IDE的控制台打印GC日志是必不可少的了。现在就告诉你怎么打印。
(1)Eclipse,打印GC日志的操作如下:
在上图的箭头处加上
Java中的锁(转载)
- 博客分类:
- 并发
在学习或者使用Java的过程中进程会遇到各种各样的锁的概念:公平锁、非公平锁、自旋锁、可重入锁、偏向锁、轻量级锁、重量级锁、读写锁、互斥锁等待。这里整理了Java中的各种锁,若有不足之处希望大家在下方留言探讨。
公平锁和非公平锁
公平锁是指多个线程在等待同一个锁时,必须按照申请锁的先后顺序来一次获得锁。
公平锁的好处是等待锁的线程不会饿死,但是整体效率相对低一些;非公平锁的好处是整体效率相对高一些,但是有些线程可能会饿死或者说很早就在等待锁,但要等很久才会获得锁。其中的原因是公平锁是严格按照请求所的顺序来排队获得锁的,而非公平锁时可以抢占的,即如果在某个时刻有线程需要获取锁,而这个 ...
java中的几种锁:synchronized,ReentrantLock,ReentrantReadWriteLock已基本可以满足编程需求,但其粒度都太大,同一时刻只有一个线程能进入同步块,这对于某些高并发的场景并不适用。本文实现了一个基于KEY(主键)的互斥锁,具有更细的粒度,在缓存或其他基于KEY的场景中有很大的用处。下面将讲解这个锁的设计和实现
(关于这个锁的讨论贴:KeyLock讨论贴-CSDN)
设想这么一个场景:转账
private int[] accounts; // 账户数组,其索引为账户ID,内容为金额
public boolean tran ...