当前位置:首页 > 编程教程 > java技术文章 > 了解JAVA并发工具常用设计套路

JAVA并发工具常用设计套路示例代码

  • 发布时间:
  • 作者:码农之家
  • 点击:141

这篇文章主要知识点是关于java、并发工具、设计套路、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

OpenCV3.0 Computer Vision with Java
  • 类型:OpenCV大小:7.42 MB格式:PDF作者:Daniel Lélis Baggio
立即下载

了解JAVA并发工具常用设计套路

前言

在学习JAVA并发工具时,分析JUC下的源码,发现有三个利器:状态、队列、CAS。

状态

一般是state属性,如AQS源码中的状态,是整个工具的核心,一般操作的执行都要看当前状态是什么,
由于状态是多线程共享的,所以都是volatile修饰,保证线程直接内存可见。

/**
* AbstractQueuedSynchronizer中的状态
*/
private volatile int state;

/**
* Status field, taking on only the values:
* SIGNAL: The successor of this node is (or will soon be)
* blocked (via park), so the current node must
* unpark its successor when it releases or
* cancels. To avoid races, acquire methods must
* first indicate they need a signal,
* then retry the atomic acquire, and then,
* on failure, block.
* CANCELLED: This node is cancelled due to timeout or interrupt.
* Nodes never leave this state. In particular,
* a thread with cancelled node never again blocks.
* CONDITION: This node is currently on a condition queue.
* It will not be used as a sync queue node
* until transferred, at which time the status
* will be set to 0. (Use of this value here has
* nothing to do with the other uses of the
* field, but simplifies mechanics.)
* PROPAGATE: A releaseShared should be propagated to other
* nodes. This is set (for head node only) in
* doReleaseShared to ensure propagation
* continues, even if other operations have
* since intervened.
* 0: None of the above
*
* The values are arranged numerically to simplify use.
* Non-negative values mean that a node doesn't need to
* signal. So, most code doesn't need to check for particular
* values, just for sign.
*
* The field is initialized to 0 for normal sync nodes, and
* CONDITION for condition nodes. It is modified using CAS
* (or when possible, unconditional volatile writes).
*/
volatile int waitStatus;

队列

队列一般由链表实现(单向链表,双向链表),在线程获取不到想要的资源或者状态时,将线程封装成特定节点,扔到等待队列中,等待时机成熟,再从队列中取出,是悲观锁思想。
如AQS中的Node节点,代码太长就不贴了。

CAS

CAS操作是乐观锁思想,是轻量级的并发处理。一般用于对上述状态的修改,而且能保证有且只有一个线程能修改这个状态。
一般由Unsafe类中的compareAndSwap之类的方法实现。使用CAS,往往伴随自旋,如果修改状态失败,则不断地重试,直到修改状态成功。

以上就是java并发编程中的套路,抓住这个思路,想必能在学习中有所帮助。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

Java 相关电子书
学习笔记
网友NO.338039

Java并发之ReentrantLock类源码解析

ReentrantLock内部由Sync类实例实现。 Sync类定义于ReentrantLock内部。 Sync继承于AbstractQueuedSynchronizer。 AbstractQueuedSynchronizer继承于AbstractOwnableSynchronizer。 AbstractOwnableSynchronizer类中只定义了一个exclusiveOwnerThread变量,表示当前拥有的线程。 除了Sync类,ReentrantLock内部还定义了两个实现类。 NonfairSync是非公平锁。FairSync 是公平锁。 ReentrantLock两个构造方法如下: ReentrantLock的lock方法 非公平锁的lock方法 compareAndSetState方法是一个CAS方法。该方法尝试去更新对象内的一个变量。变量期望是0,更新为1。 若更新成功,则将exclusiveOwnerThread变量设置为当前线程。然后lock方法会立刻返回。 若更新不成功,则调用acquire(1)。 acquire方法中首先调用tryAcquire()再次尝试更新。 非公平锁的tryAcquire()方法如下: 非公平锁的tryAcquire()方法内部调用nonfairTryAcquire方法如下: 若tryAcquire()方法……

网友NO.945549

java并发之AtomicInteger源码分析

问题 (1)什么是原子操作? (2)原子操作和数据库的ACID有啥关系? (3)AtomicInteger是怎么实现原子操作的? (4)AtomicInteger是有什么缺点? 简介 AtomicInteger是java并发包下面提供的原子类,主要操作的是int类型的整型,通过调用底层Unsafe的CAS等方法实现原子操作。 还记得Unsafe吗?点击链接直达【java Unsafe详细解析】 原子操作 原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换。 原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中的一部分,将整个操作视作一个整体是原子性的核心特征。 我们这里说的原子操作与数据库ACID中的原子性,笔者认为最大区别在于,数据库中的原子性主要运用在事务中,一个事务之内的所有更新操……

网友NO.540650

Java并发框架:Executor API详解

介绍 随着当今处理器中可用的核心数量的增加, 随着对实现更高吞吐量的需求的不断增长,多线程 API 变得非常流行。 Java 提供了自己的多线程框架,称为 Executor 框架. 1. Executor 框架是什么? Executor 框架包含一组用于有效管理工作线程的组件。Executor API 通过 Executors 将任务的执行与要执行的实际任务解耦。 这是 生产者-消费者 模式的一种实现。 java.util.concurrent.Executors 提供了用于创建工作线程的线程池的工厂方法。 为了使用 Executor 框架,我们需要创建一个线程池并提交任务给它以供执行。Executor 框架的工作是调度和执行已提交的任务并从线程池中拿到返回的结果。 浮现于脑海中的一个基本的问题是,当我们创建 java.lang.Thread 的对象或调用实现了 Runnable/Callable 接口来达到的程序的并行性时,为什么需要线程池? 答案来源于两个基本面: 为新任务创……

<
1
>

Copyright 2018-2020 www.xz577.com 码农之家

版权投诉 / 书籍推广 / 赞助:520161757@qq.com