大致分成:

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. 暂时性死区TDZ理解与总结

    为什么会出现暂时性死区? 先来看看 ES6 标准中对 let/const 声明中的解释 第13章,有如下一段文字:The variables are created when their contai ...

  2. 蚂蚁金服开源机器学习工具SQLFlow,机器学习比SQL还简单

    来自:开源最前线(ID:OpenSourceTop) 综合自:AI前线.https://github.com/sql-machine-learning/sqlflow 5月6日,蚂蚁金服副 CTO 胡 ...

  3. Noip2019暑期训练1

    题目名称 时空定位 棋子移动 高精度乘法 数独游戏 存盘文件名 location piece mul sudoku 输入文件名 location.in piece.in mul.in sudoku.i ...

  4. nRF51822 配置超过4个的 按键驱动

    最近一个用到超过4个按键驱动,PCA10028 的板子上只有4个,所以SDK9 的pca10028.h 的宏只定义了4 #define BUTTONS_NUMBER 4 但是我要用超过4个的时候,就不 ...

  5. EasyEarth三维可视化解决方案——智慧林业

    智慧林业 智能巡管监护 护林员信息查询 护林员管护范围查询 护林员报警.采集数据查看 样点.样线管理 其它功能模块 ●一键考勤打卡 ●面积测量 ●任务公告发布 ●实时电量监控 ●一键报警功能 ●北斗短 ...

  6. 【2019.12.04】SDN上机第6次作业

    实验拓扑 通过图形化界面建立拓扑 先清除网络拓扑 sudo mn -c 生成Python语句 #!/usr/bin/python from mininet.net import Mininet fro ...

  7. java 中利用反射机制获取和设置实体类的属性值

    摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...

  8. 从宿主机直接进入docker容器的网络空间

    Docker dns nameserver 也是进入容器网络空间,监听53端口,但它通过iptable把端口映射到宿主机上,处理DNS请求的进程就在宿主机上. how does Docker Embe ...

  9. Authenticator App 两步验证会不会造成亚马逊账号关联?

    今天听人说,因为用Authenticator App做亚马逊两步验证造成了帐号关联…… 我给大家解释一下Authenticator的实现原理,作为计算机专业科班出身的我,此次从各方面了解并经过自己亲测 ...

  10. 如何从OA系统批量整理出邮箱地址,并导入到Foxmail 地址薄中?

    一.打开某位leader的OA,点击查看“下属” a. 将所有的下属信息 --- 全选 --- 复制 --- 粘贴到 excel 表格中 b. 分别提取“姓名” 和 “邮箱”地址信息,结合notepa ...