`
文章列表

无锁(CAS)编程

 
 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年代从建筑设计领 域引入到计算机科学的。 ...

JDK并发编程2

 
1. 线程池的基本使用   1.1.为什么需要线程池 平时的业务中,如果要使用多线程,那么我们会在业务开始前创建线程,业务结束后,销毁线程。但是对于业务来说,线程的创建和销毁是与业务本身无关的,只关心线程所执行的任务。因此希望把尽可能多的cpu用在执行任务上面,而不是用在与业务无关的线程创建和销毁上面。而线程池则解决了这个问题,线程池的作用就是将线程进行复用。   1.2.JDK为我们提供了哪些支持    JDK中的相关类图如上图所示。 其中要提到的几个特别的类。 Callable类和Runable类相似,但是区别在于Callable有返回值。 ThreadPoolEx ...

JDK并发编程1

1. 各种同步控制工具的使用 1.1 ReentrantLock       ReentrantLock感觉上是synchronized的增强版,synchronized的特点是使用简单,一切交给JVM去处理,但是功能上是比较薄弱的。在JDK1.5之前,ReentrantLock的性能要好于synchronized,由于对JVM进行了优化,现在的JDK版本中,两者性能是不相上下的。如果是简单的实现,不要刻意去使用ReentrantLock。相比于synchronized,ReentrantLock在功能上更加丰富,它具有可重入、可中断、可限时、公平锁等特点。 首先我们通过一个例子来说明 ...
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并发学习

 
java并发特性,原子性、有序性、可见性 happen-before规则 无锁编程(CAS) JDK并发编程1 JDK并发编程2  
原子性是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其它线程干扰。 Java中的原子操作包括: 1)除long和double之外的基本类型的赋值操作 2)所有引用reference的赋值操作 3)java.concurrent.Atomic.* 包中所有类的一切操作。 但是java对long和double的赋值操作是非原子操作!!long和double占用的字节数都是8,也就是64bits。在32位操作系统上对64位的数据的读写要分两步完成,每一步取32位数据。这样对double和long的赋值操作就会有问题:如果有两个线程同时写一个变量内 ...

lunix问题笔记

 
    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与Spring整合依赖的jar <dependency> <groupId>org.glassfish.jersey.ext</groupId> <artifactId>jersey-spring3</artifactId> <version>${jersey.version}</version> <exclusions> <!-- 移除jersey自己的spring库 --> <exclusi ...

Lucene笔记

多字段精确查询  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学习笔记

    博客分类:
  • JVM
JVM参数设置

jvm参数设置

    博客分类:
  • JVM
 官方JVM参数地址 http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp   本文主要内容: Trace跟踪参数 堆的分配参数 栈的分配参数 在IDE的后台打印GC日志: 既然学习JVM,阅读GC日志是处理Java虚拟机内存问题的基础技能,它只是一些人为确定的规则,没有太多技术含量。 既然如此,那么在IDE的控制台打印GC日志是必不可少的了。现在就告诉你怎么打印。 (1)Eclipse,打印GC日志的操作如下:    在上图的箭头处加上

Java中的锁(转载)

 
在学习或者使用Java的过程中进程会遇到各种各样的锁的概念:公平锁、非公平锁、自旋锁、可重入锁、偏向锁、轻量级锁、重量级锁、读写锁、互斥锁等待。这里整理了Java中的各种锁,若有不足之处希望大家在下方留言探讨。 公平锁和非公平锁 公平锁是指多个线程在等待同一个锁时,必须按照申请锁的先后顺序来一次获得锁。 公平锁的好处是等待锁的线程不会饿死,但是整体效率相对低一些;非公平锁的好处是整体效率相对高一些,但是有些线程可能会饿死或者说很早就在等待锁,但要等很久才会获得锁。其中的原因是公平锁是严格按照请求所的顺序来排队获得锁的,而非公平锁时可以抢占的,即如果在某个时刻有线程需要获取锁,而这个 ...

Key锁

 
java中的几种锁:synchronized,ReentrantLock,ReentrantReadWriteLock已基本可以满足编程需求,但其粒度都太大,同一时刻只有一个线程能进入同步块,这对于某些高并发的场景并不适用。本文实现了一个基于KEY(主键)的互斥锁,具有更细的粒度,在缓存或其他基于KEY的场景中有很大的用处。下面将讲解这个锁的设计和实现 (关于这个锁的讨论贴:KeyLock讨论贴-CSDN)   设想这么一个场景:转账   private int[] accounts; // 账户数组,其索引为账户ID,内容为金额 public boolean tran ...
Global site tag (gtag.js) - Google Analytics