JAVA同步队列

原创 2018年04月17日 12:01:48

一。代码同步

1. ConcurrentHashMap

   采用分段方式减少锁粒度,提高并发性能。get时没有锁。

2. Copy-On-Write

    读写分离,适合于读多于写的场合。JDK里的COW容器有两种:CopyOnWriteArrayList和CopyOnWriteArraySet。

3. ConcurrentLinkedQueue

    无锁无阻塞,采用UNSAFE = sun.misc.Unsafe.getUnsafe()中的CAS(compareAndSwapObject)方式实现同步,实现了高并发状态下的高性能。通常ConcurrentLinkedQueue性能好于BlockingQueue,他是一个基于链接节点的无界线程安全队列,该队列的元素遵循先进先出的原则,头是最新加入,尾是最近加入。该队列不允许null元素。

4. ArrayBlockingQueue

    基于数组的阻塞队列实现,读写同步。有界队列,构造函数初始化数组长度,插入数据时,如果数组已满,offer方法返回false,add方法抛出异常。

//构造函数初始化数组长度,以及采用的锁是否公平锁
ArrayBlockingQueue(int capacity, boolean fair)

5. LinkedBlockingQueue

    基于链表的阻塞无界队列,读写分锁。

6. PriorityBlockingQueue

    基于数组的阻塞队列实现,读写同步。构造函数传入Comparator排序,添加新数据时自动扩容。内部控制线程同步的锁采用的是非公平锁

   public PriorityBlockingQueue(int initialCapacity,
                                 Comparator<? super E> comparator) {
        if (initialCapacity < 1)
            throw new IllegalArgumentException();
        this.lock = new ReentrantLock();
        this.notEmpty = lock.newCondition();
        this.comparator = comparator;
        this.queue = new Object[initialCapacity];
    }
   
    /**
     * Creates an instance of {@code ReentrantLock}.
     * This is equivalent to using {@code ReentrantLock(false)}.
     */
    public ReentrantLock() {
        sync = new NonfairSync();
    }

    /**
     * Creates an instance of {@code ReentrantLock} with the
     * given fairness policy.
     *
     * @param fair {@code true} if this lock should use a fair ordering policy
     */
    public ReentrantLock(boolean fair) {
        sync = fair ? new FairSync() : new NonfairSync();
    }

7. DelayQueue

    基于数组,带有延迟时间的Queue, 其中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素。

8. SynchronousQueue

    这是一个没有缓存的同步队列,采用CAS方式,读写同步。

二. 数据库锁同步

1. 物理同步(悲观锁)

    依靠数据库提供的锁机制。

    ex: select * from account where name='test' for update;

    这条语句锁定account表中所有符合条件的记录。

2. 乐观锁

    基于数据版本记录机制实现。数据表增加字段version,修改数据时只有大于数据表中的version时才生效。

Hibernate中实现了悲观锁和乐观锁。


三. 大数据量处理

当数据达到100W以上甚至上亿时,select等操作会很慢。优化方式:

1. 分表。将数据按日期或其他条件分块,分别建立结构相同的数据表

2. 缓存。使用memcached等中间件,单独设置缓存服务器。

3. 建立合适的索引,加快查询速度。

4. 组建集群分流。

参考: 

https://blog.csdn.net/t1dmzks/article/details/78359780

https://blog.csdn.net/m0_37721946/article/details/78752582

Java多线程 之 同步队列BlockingQueue与管道(十五)

一.同步队列BlockingQueue前面的两篇博文: Java多线程 之 生产者、消费者(十三) Java多线程 之 lock与condition的使用(十四) 详细阐述了多个任务之...
  • fan2012huan
  • fan2012huan
  • 2016-07-17 15:41:22
  • 1993

Java同步队列(非阻塞队列与阻塞队列)——java并发容器

java同步队列,包括非阻塞队列与阻塞队列
  • sunxianghuang
  • sunxianghuang
  • 2016-07-27 18:36:45
  • 5462

Java中的锁——队列同步器

队列同步器AbstractQueuedSynchronizer(AQS),似乎我们不经常用,但是它是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列...
  • u010723709
  • u010723709
  • 2015-12-20 13:27:12
  • 3882

java并发--队列同步器原理一

独占式同步状态获取与释放原理在同步队列中独占式获取锁的代码 public final void acquire(int arg) { if (!tryAcquire(arg) &...
  • lucas421634258
  • lucas421634258
  • 2015-12-10 23:20:13
  • 1183

队列同步器(AQS)详解

Java自定义同步组件的设计分析、设计思路与源码分析、AQS(AbstractQueuedSynchronizer)结构与原理...
  • sunxianghuang
  • sunxianghuang
  • 2016-08-23 18:15:09
  • 2870

AbstractQueuedSynchronizer同步队列与Condition等待队列协同机制

之前对AbstractQueuedSynchronizer(AQS)同步队列与Condition等待队列的功能一直不是很清晰,没太清楚地区分开二者的区别和联系,最近研究了一下分享出来。1.同步队列和等...
  • tb3039450
  • tb3039450
  • 2017-04-04 11:32:22
  • 937

Java 线程同步,消息队列,数据库

线程同步         开发一个Java服务器,需要开多个线程执行不同的任务,在做线程同步时,发现了一个比较合适的类——CountDownLatch,可以用于协调不同线程的执行顺序。      ...
  • ZJU_fish1996
  • ZJU_fish1996
  • 2017-03-09 13:19:10
  • 764

JAVA AQS抽象队列同步器详解

之前看到一篇很好的介绍AQS抽象队列同步器的文章,分享下。框架维护了一个state(代表共享资源,注意是volatile修饰的保证可见性)和一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列...
  • Thousa_Ho
  • Thousa_Ho
  • 2017-09-21 08:47:50
  • 285

JAVA并发-条件队列

在JVM系列博客http://yizhenn.iteye.com/blog/2290864中讲过,Java语言的同步机制在底层实现上只有两种手段:&quot;互斥&quot;和&quot;协同&quo...
  • yizhenn
  • yizhenn
  • 2016-08-11 14:15:25
  • 1457

java多线程同步笔记——阻塞队列

阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列...
  • woshimalingyi
  • woshimalingyi
  • 2015-11-28 01:44:32
  • 1144
收藏助手
不良信息举报
您举报文章:JAVA同步队列
举报原因:
原因补充:

(最多只允许输入30个字)