java 多线程知识梳理2

ReentrantLock和synchronized的选择

1 synchronized的弊端,简化了代码工作,并且与异常处理操作实现了很好的交互,但是表现不够灵活,对线程控制较小,比如无法中断等待的线程,或者无法在请求获取锁时无限的等待,也没法实现非阻塞结构的加锁规则。

2 reentrantlock, java5.0以后才引入,实现了Lock 接口,提供了与synchronized相同的互斥性和内存可见性。在java5.0里面性能优势比内置锁明显,java6.0里面差不多,是内置锁的补充,不是替代,

public interfance Lock{

void lock();

void lockInterruptibly() throws InterruptedException;//可中断的所获取操作

boolean tryLock();//轮询锁,避免死锁的发生

boolean tryLock(Long timeout, TimeUnit unit);//定时锁,避免死锁的发生

void unlock();

Condition newCondition();

}

使用标准

Lock lock = new reentrantLock()

......

lock.lock();

try{

}catch(){

//执行更新操作

}finally{

lock.unlock();

}

tryLock,比如同时需要获取两个对象的锁才能开始执行业务,

if(alock.tryLock())

try{

  if(block.tryLock())

  try{

    //执行业务操作

  }catch{

  }finally{

  block.unlock();

  }

}catch{

}finally{

alock.unlock();

}

3 reentrantReadWriteLock 读写锁,一个资源可以被多个读操作访问,或者被一个写操作访问,但两者不能同时进行。他允许多个执行读操作的线程访问数据结构,能有效提高程序性能。

pubilc interface ReadWriteLock(){

Lock readLock();

Lock writeLovk();}

基于读写锁包装map:

public class ReadWriteMap{

private final Map<K,V> map;

private final ReadWriteLock lock =  new ReentrantReadWriteLock();

private final Lock r = lock.readLock();

private final Lock w = lock.writeLock();

public ReadWriteMap(Map<K,V> map){

this.map=map;

}

public V put(K key,V value){

w.lock();

try{

return map.put(key,value);

}catch{

}finally{

w.unlock();

}

public V get(K key){

r.lock();

try{

return get(key)

}catch{

}finally{

r.unlock();

}

}

时间: 2024-10-11 12:28:28

java 多线程知识梳理2的相关文章

java 多线程知识梳理1

概念 JMM:规定了jvm有主内存(Main Memory)和工作内存(Working Memory) ,主内存存放程序中所有的类实例.静态数据等变量,是多个线程共享的,而工作内存存放的是该线程从主内存中拷贝过来的变量以及访问方法所取得的局部变量, 是每个线程私有的其他线程不能访问,每个线程对变量的操作都是以先从主内存将其拷贝到工作内存再对其进行操作的方式进行,多个线程之间不能直接互相传递数 据通信,只能通过共享变量来进行. 操作指令:JLS定义了线程对主存的操作指令:read,load,use

java 多线程知识梳理4

常用并发辅助类 CountDownLatch Semaphore CyclicBarrier, 都基于ReentrantLock实现. 1 Semaphores       are often used to restrict the number of threads than can * access some (physical or logical) resource. For example, here is * a class that uses a semaphore to con

java多线程核心技术梳理(附源码)

java多线程核心技术梳理(附源码) java多线程核心技术梳理附源码 写在前面 java多线程 对象及变量的并发访问 线程间通信 Lock的使用 定时器 单例模式与多线程 拾遗补增 参考资料 本文对多线程基础知识进行梳理,主要包括多线程的基本使用,对象及变量的并发访问,线程间通信,lock的使用,定时器,单例模式,以及线程状态与线程组. 写在前面 花了一周时间阅读<java多线程编程核心技术>(高洪岩 著),本文算是此书的整理归纳,书中几乎所有示例,我都亲手敲了一遍,并上传到了我的githu

Java基础知识梳理《一》

一.Java数据类型(简单称之为“四类八种”) java 基本的数据类型长度都是固定的,好处是在实现跨平台时就统一了. 1.整型 byte short int long (分别是1,2,4,8个字节) 类型 存储需求 位数 取值范围 byte 1字节 8位 -128~127 short 2字节 16位 -2^15 ~2^15-1 int 4字节 32位 -2^31~2^31-1 long 8字节 64位 -2^63~2^63-1 当超出int表示范围时,应该使用long型,添加后缀一大写的L 注

Java多线程知识小抄集(三)

本文主要整理博主遇到的Java多线程的相关知识点,适合速记,故命名为"小抄集".本文没有特别重点,每一项针对一个多线程知识做一个概要性总结,也有一些会带一点例子,习题方便理解和记忆. 51. SimpleDateFormat非线程安全 当多个线程共享一个SimpleDateFormat实例的时候,就会出现难以预料的异常. 主要原因是parse()方法使用calendar来生成返回的Date实例,而每次parse之前,都会把calendar里的相关属性清除掉.问题是这个calendar是

Java多线程知识小抄集(二)

本文主要整理博主遇到的Java多线程的相关知识点,适合速记,故命名为"小抄集".本文没有特别重点,每一项针对一个多线程知识做一个概要性总结,也有一些会带一点例子,习题方便理解和记忆. 1-26请参考<Java多线程知识小抄集(一)> 27. ConcurrentHashMap ConcurrentHashMap是线程安全的HashMap,内部采用分段锁来实现,默认初始容量为16,装载因子为0.75f,分段16,每个段的HashEntry 28. 线程安全的非阻塞队列 非阻塞

JAVA多线程知识总结(二)

本文是承接上一篇文章:JAVA多线程知识总结(一) 四.Java多线程的阻塞状态与线程控制  上文已经提到线程阻塞的集中具体类型.下面主要看引起JAVA线程阻塞的方法 1,join()-----让一个线程等待另一个线程完成之后才继续执行,如A线程的执行体中调用B线程的join方法,则A线程被阻塞,知道B线程执行完成之后,A才得以继续执行 package com.bpan.spring.beans.thread; public class ThreadTestJoin { public stati

Java SE知识梳理

本系列文章只是对JavaSE相关知识点的梳理,全面了解JavaSE知识结构,便于以后遇到相关问题时可以查找来源. 文中所有知识的具体细节都可以从其他网络博客或者API文档中获取.我就不写那么详细了. 耗费我三个星期,废寝忘食整理出来的,今天终于告一段落了.后面还会介绍一些开源库,尽请期待. 文章列表: Java 基础内容简介 Java 集合与泛型 Java 异常处理 Java 注解 Java 文件和IO Java NIO Java 对象序列化 Java 多线程和高并发 Java 类加载机制 Ja

Java多线程知识小抄集(一)

本文主要整理博主遇到的Java多线程的相关知识点,适合速记,故命名为"小抄集".本文没有特别重点,每一项针对一个多线程知识做一个概要性总结,也有一些会带一点例子,习题方便理解和记忆. 1. interrupted与isInterrupted的区别 interrupted():测试当前线程是否已经是中断状态,执行后具有状态标志清除为false的功能. isInterrupted():测试线程Thread对象是否已经是中断状态,但不清楚状态标志. 方法: public static boo