JAVA开发需求分析套路_JAVA并发工具常用设计套路示例代码

了解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的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/417324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用PXE+VNC方式安装CentOS 7

U盘坏了,用个下面的方法安装 安装配置dhcp yum -y install dhcp tftp-server 修改如下,网段改为你自己的网段 vim /etc/dhcp/dhcpd.confsubnet 172.16.1.0 netmask 255.255.255.0 {range 172.16.1.100 172.16.1.200;option subnet-mask 255.255.255.0;de…

Oracle常见错误

///ORA-12520: TNS: 监听程序无法找到需要的服务器类型的可用句柄专用服务器选择了共享连接方式,修改(SERVER SHARED)为(SERVER DEDICATED)///ORA-12096,快照日志问题删除物化视图建的日志表DROP MATERIALIZED VIEW LOG ON [schema.]table;然后重建。///OracleExce…

Oracle DMP 导入导出

导出:运行-->输入cmd-->进入DOS环境-->输入命令:exp 用户名/密码数据库名 filexxx.dmp就可以实现数据库的导出了导入:CREATE USER username IDENTIFIED BY userpass;GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,DRO…

Shell 自定义函数

语法: function fname() { 程序段} 例子: #!/bin/bash## 定义函数,分子除以分母,算利润、占有率等## 参数1:分子## 参数2:分母function divfun() {## 参数判断,需要输入两个参数 if [ $# -ne 2 ];thenecho "Enter…

java kafka 集群消费_kafka集群简单生产者消费者实例

项目描述本项目是个简单的kafka集群简单生产者和消费者实例,生产者能生产消息,消费者能消费消息,这里将消费的消息存入了mysql数据库,适合刚kafka刚入门的朋友借鉴使用,里面的zookeeper集群和kafka集群的地址需要修改为…

微信小程序 body属性的问题

微信小程序里面没有了body这个节点了,取而代之的是page转载于:https://www.cnblogs.com/kugeliu/p/6370687.html

Oracle trunc函数

trunc对日期按格式截尾对数字按位数截尾trunc(-123.56,1) -123.5trunc(-123.56) -123trunc(-123.56,-1) -120

SQLServer获取最后插入生成的ID 不同方法

如果想获取跨任何会话或作用域的某个表的最新标识值,请使用IDENT_CURRENT。 如果想获取当前会话和当前作用域的任何表的最新标识值,请使用SCOPE_IDENTITY。 如果想获取当前会话中任何作用域的任何表的最新标识值,请使用IDENTITY。

java二叉树转换为链表_leetcode刷题笔记-114. 二叉树展开为链表(java实现)

leetcode刷题笔记-114. 二叉树展开为链表(java实现)题目描述给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的…

EJB是什么?EJB的概念分析与理解(copy)

【说明:转载于http://blog.csdn.net/jojo52013145/article/details/5783677】 1. 我们不禁要问,什么是"服务集群"?什么是"企业级开发"? 既然说了EJB 是为了"服务集群"和"企业级开发"&…

adb需要安装java吗_jdk和adb配置及电脑装爽系统心得

1.双系统安装我选择安装的windows10和Linux Mint 18.2索尼娅首先我们需要先安装win10,可以采用360压缩直接见将win10镜像解压到u盘当做系统盘使用(lInux也是一样)安装WIndows系统大家应该都会我主要说一下关于lInux的安装首先如果我们有固态硬盘的化可以考虑将其分成…

如何用JavaScript判断dom是否有存在某class的值?

例如&#xff1a; <html class"no-js"> <head> </head> <body> </body> </html> 判断html节点的class是否有no-js。 1.jquery的实现方式 $("html").hasClass(no-js); jquery源码的实现方式&#xff1a; var rclass /…

SQLite shell操作

>sqlite3 E:/Data/test.db创建或连接已有数据库>.help 帮助>.tables 所有表>.databases 当前挂的所有数据库>select * from A limit 3; 查询语句

centos 7用ss命令来查看端口占用和对应进程

mysqld进程在监听4567端口&#xff0c;进程id是2593&#xff1a; # ss -lnp|grep 4567 tcp LISTEN 0 128 :4567 :* users:(("mysqld",2593,11)) 2593的父进程是2592&#xff1a; # ps -ef|grep 2593 mysql 2593 2592 0 04:46 ? 00:00:57 /usr/libexec/mysqld --wsre…

java 分批同时处理_java中List集合分批处理

在项目中存在list集合数据量过大&#xff0c;需要对这个list集合进行分批处理&#xff0c;自己写了一个list分批处理的一个算法&#xff1a;package com.lv.huizhong.demo;import java.util.ArrayList;import java.util.List;public class ListSplit {public static void main(…

C# IIS ManagementException: 访问遭到拒绝

ManagementException: 访问遭到拒绝原理&#xff1a;页面&#xff08;与IIS有关&#xff09;运行的权限低于DLL运行的权限&#xff0c;估计是微软考虑到什么黑客会利用此漏洞而设计的。只要在Global里或httpModules把这个值获取就没问题。实时获取CPU内存情况可以在Global中每隔…

Linux下出现ping:unknown host xxx.xxx问题的解决办法

如果ping域名的时候出现ping:unknown host xxx.xxx 但是ping IP地址的时候可以通的话 可知是dns服务器没有配置好&#xff0c; 查看一下配置文件/etc/resolv.conf&#xff0c;里面是否有nameserver xxx.xxx.xxx.xxx&#xff0c;比如使用dns服务器 nameserver 8.8.8.8&#xff…