大致分成:

1.原子更新基本类型

2.原子更新数组

3.原子更新抽象类型

4.原子更新字段

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicIntegerArray;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.concurrent.atomic.AtomicReference; public class Sequence {
private AtomicInteger value=new AtomicInteger(0);
private int [] s={2,1,4,6};
AtomicIntegerArray array=new AtomicIntegerArray(s); AtomicReference<User> use=new AtomicReference<>(); AtomicIntegerFieldUpdater<User> old=
AtomicIntegerFieldUpdater.newUpdater(User.class,
"old"); public int getNext(){
User user=new User();
System.out.println(old.getAndIncrement(user));
System.out.println(old.getAndIncrement(user));
System.out.println(old.getAndIncrement(user));
old.getAndIncrement(user);
array.getAndIncrement(2);
array.getAndAdd(2, 10);
return value.getAndIncrement();//自增value++
//value.incrementAndGet();//++value
}
public static void main(String[] args) {
Sequence s=new Sequence();
new Thread(new Runnable() { @Override
public void run() {
System.out.println(Thread.currentThread().getName()+""
+s.getNext());
try {
Thread.sleep(100);
} catch (InterruptedException e) { e.printStackTrace();
}
} }).start();
// new Thread(new Runnable() {
//
// @Override
// public void run() {
// System.out.println(Thread.currentThread().getName()+""
// +s.getNext());
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
//
// e.printStackTrace();
// }
// }
//
// }).start();
}
}

  Lock接口:

Lock需要显示的获取和释放锁,繁琐,但是能让代码更灵活,随时,获取和释放锁

Synchronized:不需要显示的获取和释放锁 ,简单

使用lock可以方便的实现公平性

非阻塞的获取锁

能被中断的获取锁

超时获取锁

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class Sequence {
private int value;
Lock lock=new ReentrantLock();//所有的线程公用一把锁
public int getNext() {
lock.lock();
int a= value++;
lock.unlock();
return a;
} public static void main(String[] args) {
Sequence s = new Sequence();
new Thread(new Runnable() { @Override
public void run() {
while (true) {
System.out.println(Thread.currentThread().getName() + "" + s.getNext());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} }).start(); new Thread(new Runnable() { @Override
public void run() {
while (true) {
System.out.println(Thread.currentThread().getName() + "" + s.getNext());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} }).start(); new Thread(new Runnable() { @Override
public void run() {
while (true) {
System.out.println(Thread.currentThread().getName() + "" + s.getNext());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} }).start();
}
}

  实现一个锁的重入:

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock; public class MyLock implements Lock{ private boolean isLocked=false;
private Thread lockBy=null;
private int lockCount=0;
@Override
public synchronized void lock() {
//Thread.activeCount()
Thread currentThread=Thread.currentThread();//获取当前线程
while(isLocked &&currentThread!=lockBy){ //不相等,等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
isLocked=true;
lockBy=currentThread;
lockCount++;
}
} @Override
public synchronized void unlock() {
if(lockBy==Thread.currentThread()){
lockCount--;
if(lockCount==0){
notify();
isLocked=false;
}
}
}
@Override
public void lockInterruptibly() throws InterruptedException {
// TODO Auto-generated method stub } @Override
public Condition newCondition() {
// TODO Auto-generated method stub
return null;
} @Override
public boolean tryLock() {
// TODO Auto-generated method stub
return false;
} @Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
// TODO Auto-generated method stub
return false;
}
}

  

public class Demo {
MyLock lock=new MyLock();
public void a(){
lock.lock();
System.out.println("a");
b();
lock.unlock();
}
public void b(){
lock.lock();
System.out.println("b");
lock.unlock();
}
public static void main(String[] args) {
Demo demo=new Demo();
new Thread(new Runnable() {
@Override
public void run() {
demo.a();
}
}).start();
}
}

  AbstractQueuedSynchronizer(AQS)

开发文档:http://tool.oschina.net/apidocs/apidoc?api=jdk-zh

公平锁:

公平锁是对锁的获取而言,如果一个锁是公平的,那么锁的获取顺序就是应该符合请求的绝对时间顺序。

import java.util.ArrayList;
import java.util.List; public class FairLock {
private boolean isLocked=false;
private Thread lockingThread=null;
private List<QueueObject> waitingThreads=new ArrayList<QueueObject>(); private void lock() throws InterruptedException{
QueueObject queueObject=new QueueObject();
synchronized (this) {
waitingThreads.add(queueObject);
}
try {
queueObject.doWait();
} catch (InterruptedException e) {
synchronized (this) {
waitingThreads.remove(queueObject);
}
throw e;
}
} public synchronized void unlock(){
if(this.lockingThread!=Thread.currentThread()){
throw new IllegalMonitorStateException("Calling thread has not locked this lock");
}
isLocked=false;
lockingThread=null;
if(waitingThreads.size()>0){
waitingThreads.get(0).doNotify();
}
}
}

  

public class QueueObject {
private boolean isNotified=false;
public synchronized void doWait() throws InterruptedException{
while(!isNotified){
this.wait();
}
this.isNotified=false;
}
public synchronized void doNotify(){
this.isNotified=true;
this.notify();
}
public boolean equals(Object o){
return this==o;
}
}

  aqs实现锁重入:

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock; public class MyLock2 implements Lock{
private Helper helper=new Helper();
private class Helper extends AbstractQueuedSynchronizer{
@Override
protected boolean tryAcquire(int arg){
//如果第一个线程进来,可以拿到锁,可以返回true //第二个线程进来,拿不到锁,返回false.有种特列,
//如果当前进来的线程的和当前保存的线程是同一个线程,则可以拿到锁,但是有代价。要更新状态的值 //如何判断是第一个线程进来,还是其他线程
int state=getState();
Thread t=Thread.currentThread();
if(state==0){
if(compareAndSetState(0, arg)){
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
}else if(getExclusiveOwnerThread()==t){
setState(state+1);
return true;
} return false;
}
@Override
protected boolean tryRelease(int arg){
//锁的获取和释放肯定是一一对应的,那么调用此方法的线程一定是当前线程
if(Thread.currentThread()!=getExclusiveOwnerThread()){
throw new RuntimeException();
}
int state=getState()-arg;
boolean flag=false;
if(getState()==0){
setExclusiveOwnerThread(null);
flag=true;
}
setState(state);
return flag;
}
Condition newCondition(){
return new ConditionObject();
}
} @Override
public void lock() {
helper.acquire(1);
} @Override
public void lockInterruptibly() throws InterruptedException {
helper.acquireInterruptibly(1);
} @Override
public Condition newCondition() {
return helper.newCondition();
} @Override
public boolean tryLock() {
return helper.tryAcquire(1);
} @Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
return helper.tryAcquireNanos(1, unit.toNanos(time));
} @Override
public void unlock() {
helper.release(1);
} }

  

public class Main {
private int value;
private MyLock2 lock=new MyLock2();
public int next(){
lock.lock();
try {
Thread.sleep(300);
return value++;
} catch (InterruptedException e) {
throw new RuntimeException();
}finally {
lock.unlock();
}
}
public void a(){
lock.lock();
System.out.println("a");
b();
lock.unlock();
}
public void b(){
lock.lock();
System.out.println("b");
lock.unlock();
}
public static void main(String[] args) {
Main m=new Main();
new Thread(new Runnable() {
@Override
public void run() {
m.a();
}
}).start();
// new Thread(new Runnable() {
// @Override
// public void run() {
// while(true){
// System.out.println(Thread.currentThread().getId()
// +""+ m.next());
// }
// }
// }).start();
// new Thread(new Runnable() {
// @Override
// public void run() {
// while(true){
// System.out.println(Thread.currentThread().getId()
// +""+ m.next());
// }
// }
// }).start();
} }

JDK提供的原子类和AbstractQueuedSynchronizer(AQS)的更多相关文章

  1. Java并发编程原理与实战十三:JDK提供的原子类原理与使用

    原子更新基本类型 原子更新数组 原子更新抽象类型 原子更新字段 原子更新基本类型:   package com.roocon.thread.t8; import java.util.concurren ...

  2. JDK提供的原子类原理与使用

    原子更新基本类型 原子更新数组 原子更新抽象类型 原子更新字段 原子更新基本类型: package com.roocon.thread.t8; import java.util.concurrent. ...

  3. 并发编程学习笔记(4)----jdk5中提供的原子类及Lock使用及原理

    (1)jdk中原子类的使用: jdk5中提供了很多原子类,它会使变量的操作变成原子性的. 原子性:原子性指的是一个操作是不可中断的,即使是在多个线程一起操作的情况下,一个操作一旦开始,就不会被其他线程 ...

  4. css 框架——base.css,作用是重设浏览器默认样式和提供通用原子类。自己留存

    今天发下我自己的 css 框架——base.css,作用是重设浏览器默认样式和提供通用原子类. @charset "utf-8"; /*! * @名称:base.css * @功能 ...

  5. B8 Concurrent JDK中的乐观锁与原子类

    [概述] 乐观锁采用的是一种无锁的思想,总是假设最好的情况,认为一个事务在读取数据的时候,不会有别的事务对数据进行修改,只需要在修改数据的时候判断原数据数据是否已经被修改了.JDK 中 java.ut ...

  6. Java多线程系列——原子类的实现(CAS算法)

    1.什么是CAS? CAS:Compare and Swap,即比较再交换. jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronou ...

  7. 【Java并发工具类】原子类

    前言 为保证计数器中count=+1的原子性,我们在前面使用的都是synchronized互斥锁方案,加锁独占访问的方式未免太过霸道,于是我们来介绍另一种解决原子性问题的无锁方案:原子变量.在正式介绍 ...

  8. 【漫画】CAS原理分析!无锁原子类也能解决并发问题!

    本文来源于微信公众号[胖滚猪学编程].转载请注明出处 在漫画并发编程系统博文中,我们讲了N篇关于锁的知识,确实,锁是解决并发问题的万能钥匙,可是并发问题只有锁能解决吗?今天要出场一个大BOSS:CAS ...

  9. java的原子类到底是啥?ABA,CAS又是些什么?

    1)解决并发不是用锁就能解决吗,那SDK干嘛还要搞个原子类出来? 锁虽然能解决,但是加锁解锁始终还是对性能是有影响的,并且使用不当可能会造成死锁之类的问题. 2)原子类是怎样使用的,比如说我要实现一个 ...

随机推荐

  1. tomcat9源码导入idea

    maven部署 下载源码 tomcat最新版的github地址 tomcat9官网下载 步骤 源码根目录新建 home 文件夹 把 conf 文件夹和 webapps 文件夹移动到 home 文件夹 ...

  2. [HAOI2018]染色(NTT)

    前置芝士 可重集排列 NTT 前置定义 \[\begin{aligned}\\ f_i=C_m^i\cdot \frac{n!}{(S!)^i(n-iS)!}\cdot (m-i)^{n-iS}\\ ...

  3. vue中使用vue-pdf插件显示pdf

    最近项目需求需要在vue中展示pdf,上网搜索了实现方法,找到vue-pdf这个插件非常好用,并且还有许多方法.属性能进行功能扩展. 一.安装 npm install --save vue-pdf 二 ...

  4. ASP.NET MVC5+EF6+EasyUI 后台管理系统-代码生成器用法

    新的代码生成器比老的更加容易使用,要生成什么形式就选择什么形式,新的代码生成器采用的是WCF界面开发,同样采用开源的模式,根据自己使用习惯容易扩展 1.单列表模式 2.树形列表模式 3.左右列表模式 ...

  5. Linux系统学习(一)一Linux介绍

    一.Linux初识 1.1 Linux是什么 Linux是一种自由和开放源码的类UNIX操作系统,使用Linux内核.目前存在着许多不同的Linux发行版,可安装在各种各样的电脑硬件设备,从手机.平板 ...

  6. [Beta]第三次 Scrum Meeting

    [Beta]第三次 Scrum Meeting 写在前面 会议时间 会议时长 会议地点 2019/5/7 22:00 30min 大运村公寓6F寝室 附Github仓库:WEDO 例会照片 工作情况总 ...

  7. 第10组 Alpha冲刺(5/6)

    链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 学习调用中国天气网API,接近实现天气推送功能 对天气推送的形式进行讨论及重确 ...

  8. 【定制开发】经纪人报备软件 全民经纪人系统 房产中介微信小程序分享家恒房通

    信真科技2019年最先扛鼎之作 - 全民经纪人软件系统 1.含有最基础的经纪人注册.客户报备系统功能: 2.可支持定制开发,针对房企售楼部.中介门店: 3.与微信端绑定使用,方便快捷,快速分享: 4. ...

  9. Linux:读取文件,每行拆分,并比较拆分数组长度

    读取文件,每行拆分,并比较拆分数组长度 #!/bin/bash FILENAME=./.txt function While_read_LINE(){ cat $FILENAME | while re ...

  10. jquery数组倒序

    倒叙前:var mem = [1, 2, 3]: 倒序后:var men1=[3,2,1]: <script type="text/javascript"> $(fun ...