Java集合类源码同步否~

存档~~~~

Synchronized,volatile,lock

锁->[就绪队列,堵塞队列]

第一个是jvm层次实现的。与volatile不同的是,后者不能从工作内存写回到主存。所以后者常用于类变量的同步

lock来说,在竞争资源激烈的情况下,效率最高。

引用下:http://zzhonghe.iteye.com/blog/826162

synchronized:

在资源竞争不是很激烈的情况下,偶尔会有同步的情形下,synchronized是很合适的。原因在于,编译程序通常会尽可能的进行优化synchronize,另外可读性非常好,不管用没用过5.0多线程包的程序员都能理解。

ReentrantLock:

ReentrantLock提供了多样化的同步,比如有时间限制的同步,可以被Interrupt的同步(synchronized的同步是不能Interrupt的)等。在资源竞争不激烈的情形下,性能稍微比synchronized差点点。但是当同步非常激烈的时候,synchronized的性能一下子能下降好几十倍。而ReentrantLock确还能维持常态。

Atomic:

和上面的类似,不激烈情况下,性能比synchronized略逊,而激烈的时候,也能维持常态。激烈的时候,Atomic的性能会优于ReentrantLock一倍左右。但是其有一个缺点,就是只能同步一个值,一段代码中只能出现一个Atomic的变量,多于一个同步无效。因为他不能在多个Atomic之间同步。

附一下,快速查看源码吧

package com.lean;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.TreeSet;
import java.util.Vector;

public class JavaSouse {
	public static void main(String[] args) {

/*
 * Collection->List,Set
 * Map
 */

//-----------Map接口-----------------
		/*
		 * !!!!继承Dictionary,实现Map接口了
		 * 负载因子0.75  容器长度11
		 * 阏值=容器量*负载因子
		 * 方法同步
		 * 超出阏值,扩增2倍newCapacity = oldCapacity * 2 + 1;
		 */
		Hashtable<String,String> ht= new Hashtable<String,String>();
		ht.put("0", "0");

		/*
		 * 继承AbstractMap,实现Map接口
		 * 方法不同步
		 * 2倍扩增
		 */
		HashMap<String,String>  hm=new HashMap<String,String>();
		hm.put("0", "0");

		/*
		 * synchronized实现同步
		 *
		 */
		Collections.synchronizedMap(hm);

//---------------------Set接口	----------------基于Map接口实现的类实现的

		/*
		 *继承AbstractSet,实现Set
		 *方法不同步
		 * 集合内元素不同
		 * resize(2 * table.length);扩增2倍容量
		 */
		HashSet<String> hs=new HashSet<String>();
		hs.add("0");

		/*
		 *
		 */
		LinkedHashSet<String > lhs=new LinkedHashSet<String>();
		lhs.add("0");
		/*
		 * 基于TreeMap实现
		 * 排序升序对象集--红黑树---2-3-4树预习下就很容易学~
		 * 对于红黑树记住一句话吧~~~~~
		 * !!!!一颗跟和叶子为黑色,并且跟叶路径中不存在连续的红色,任意节点到叶子节点的所有路径有相同数量的黑色节点的自二叉平衡树
		 */
		TreeSet<String > ts=new TreeSet<String>();
		ts.add("0");

//---	List接口	-----------------------基于Array接口实现
		/*
		 *方法不同步
		 * object数组实现的,初始化容量10
		 * modCount记录修改的次数,数组迭代过程可以有效的判断失败并返回
		 * 扩增1.5倍
		 */
		ArrayList<String> al=new ArrayList<String>();
		al.add("0");

		LinkedList<String> ll=new LinkedList<String>();
		ll.add("00");

		/*
		 * 方法同步synchronized
		 * 默认10,扩增2倍:
		 * int newCapacity = (capacityIncrement > 0) ?(oldCapacity + capacityIncrement) : (oldCapacity * 2);
		 *
		 */
		Vector<String> vt=new Vector<String>();
		vt.add("1");

	}
}
时间: 2024-08-03 01:58:54

Java集合类源码同步否~的相关文章

java集合类源码剖析

java集合类源码剖析 hashmap 底层实现 HashMap.Entry数组,数组+拉链 static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; Entry<K,V> next; final int hash; } Entry对象代表了HashMap中的一个元素(键值对) hashCode相同(碰撞)的元素将分配到Entry数组的同一个桶中 同一个桶中的Entry对象由nex

java 集合类源码分析--linkedlist

一.源码解析 1. LinkedList类定义2.LinkedList数据结构原理3.私有属性4.构造方法5.元素添加add()及原理6.删除数据remove()7.数据获取get()8.数据复制clone()与toArray()9.遍历数据:Iterator()二.ListItr 一.源码解析 1. LinkedList类定义. public class LinkedList<E> extends AbstractSequentialList<E> implements List

Java集合类源码解析:Vector

引言 之前的文章我们学习了一个集合类 ArrayList,今天讲它的一个兄弟 Vector. 为什么说是它兄弟呢?因为从容器的构造来说,Vector 简直就是 ArrayList 的翻版,也是基于数组的数据结构,不同的是,Vector的每个方法都加了 synchronized 修饰符,是线程安全的. 类声明 用idea打开 Vector 的源码,不难发现,它的类声明跟 ArrayList 一模一样,都是继承了AbstractList,并且都实现了RandomAccess 接口,遍历元素用for循

java集合类源码分析-concurrentHashMap

Java Core系列之ConcurrentHashMap实现(JDK 1.7) ConcurrentHashMap类似Hashtable,是HashMap更高效的线程安全版本的实现.不同于Hashtable简单的将所有方法标记为synchronized,它将内部数组分成多个Segment,每个Segment类似一个Hashtable,从而减少锁的粒度,并且它内部有一些比较tricky实现,让get操作很多时候甚至不需要锁(本文代码基于JDK 1.7,它在JDK 1.6的基础上做了进一步的优化,

java 集合类源码分析--arrayList

ArrayList就是传说中的动态数组,就是Array的复杂版本,它提供了如下一些好处:动态的增加和减少元素.灵活的设置数组的大小...... 认真阅读本文,我相信一定会对你有帮助.比如为什么ArrayList里面提供了一个受保护的removeRange方法?提供了其他没有被调用过的私有方法? 首先看到对ArrayList的定义: public class ArrayList<E> extends AbstractList<E> implements List<E>,

java 集合类源码分析--Vector

首先我们来看JDK源码中Java.util.Vector的代码,剔除所有的方法和静态变量, Java.lang.Vector的核心代码如下: public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { protected Object[] elementData; /** * The number of

Java集合类源码解析:AbstractList

今天学习Java集合类中的一个抽象类,AbstractList. 初识AbstractList AbstractList 是一个抽象类,实现了List<E>接口,是隶属于Java集合框架中的 根接口 Collection 的分支,由其衍生的很多子类因为拥有强大的容器性能而被广泛应用,例如我们最为熟悉的ArrayList,这是它的类继承结构图: 特殊方法 AbstractList 虽然是抽象类,但其内部只有一个抽象方法 get(): abstract public E get(int index

Java集合类源码解析:AbstractMap

目录 引言 源码解析 抽象函数entrySet() 两个集合视图 操作方法 两个子类 参考: 引言 今天学习一个Java集合的一个抽象类 AbstractMap ,AbstractMap 是Map接口的 实现类之一,也是HashMap.TreeMap.ConcurrentHashMap 等的父类,它提供了Map 接口中方法的基本实现(关于Map接口有疑惑的同学可参考 Java集合类根接口:Collection 和 Map) 源码解析 因为 AbstractMap 类是实现Map接口的抽象类,所以

java 集合类源码分析--arrays

本文介绍一下java集合相关类arryas类的内容 .Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Primitive(8种基本类型)和Object两大类. 基本类型:采用调优的快速排序: 对象类型:采用改进的归并排序. 1.对于基本类型源码分析如下(以int[]为例): public static void sort(int[] a, int fromIndex, int toIndex) { //进行数组的界限检查 rangeCheck(a.