JDK提供的原子类

大致分成:

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();
	}
}

  

原文地址:https://www.cnblogs.com/sunliyuan/p/11143600.html

时间: 2024-11-06 07:34:02

JDK提供的原子类的相关文章

高并发编程-07-JDK提供的原子类操作及原理

1,原子类介绍: 针对数据类型的操作,JDK提供的原子类来方便我们的线程安全控制. 所有的类保存在 java.util.concurrent.atomic 包中 基本数据类型 AtomicInteger 数组类型 AtomicIntegerArray 2,举个使用的例子: 解决之前的 i++ 安全性问题 如何解决? AtomicInteger count = new AtomicInteger(0); count.incrementAndGet();//相当于count++,区别是这里可以保证是

Java并发编程-非阻塞同步方式原子类(Atomic)的使用

非阻塞同步 在大多数情况下,我们为了实现线程安全都会使用Synchronized或lock来加锁进行线程的互斥同步,但互斥同步的最主要的问题就是进行线程的阻塞和唤醒所带来的性能问题,因此这种阻塞也称作阻塞同步.从处理问题的方式上说,互斥同步属于一种悲观的并发策略,总是认为只要不去做正确的同步措施,那就肯定会出现问题,无论共享数据是否真的会出现竞争,它都会进行加锁.用户态核心态转换.维护锁的计数器和检查是否有被阻塞的线程需要被唤醒等操作. 随着硬件指令集的发展,我们有了另一个选择:基于冲突检测的乐

Java单例模式结合JUC原子类爆发的新想法

单例模式是23种设计模式中的一种,关于它的介绍,已经数不胜数了,一般网上的实现方式无非是什么懒汉式,饿汉式,内部类,枚举,volatile加双重校验锁等等,今天我又想到一个新的实现方式,利用J.U.C提供的原子类,代码如下: class SingleTon { private static AtomicReference<SingleTon> reference = new AtomicReference<>(); private SingleTon() { } public st

Netty的并发编程实践3:CAS指令和原子类

互斥同步最主要的问题就是进行线程阻塞和唤醒所带来的性能的额外损耗,因此这种同步被称为阻塞同步,它属于一种悲观的并发策略,我们称之为悲观锁.随着硬件和操作系统指令集的发展和优化,产生了非阻塞同步,被称为乐观锁.简单地说,就是先进行操作,操作完成之后再判断操作是否成功,是否有并发问题,如果有则进行失败补偿,如果没有就算操作成功,这样就从根本上避免了同步锁的弊端. 目前,在Java中应用最广泛的非阻塞同步就是CAS,在IA64.X86指令集中通过cmpxchg指令完成CAS功能,在sparc-TSO中

Java学习笔记—多线程(原子类,java.util.concurrent.atomic包,转载)

原子类 Java从JDK 1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中 的原子操作类提供了一种用法简单.性能高效.线程安全地更新一个变量的方式. 因为变量的类型有很多种,所以在Atomic包里一共提供了13个类,属于4种类型的原子更 新方式,分别是原子更新基本类型.原子更新数组.原子更新引用和原子更新属性(字段). Atomic包里的类基本都是使用Unsafe实现的包装类 java.util.concurrent.atomic中的类

java基础---多线程---JUC原子类

总结: 原子包提供了四种类型的原子类.包括基本数据类型,数组,引用类型,引用类型成员变量四种. 底层使用CAS操作保证原子性,CAS就是compare and swap先比较,如果是期望的值就进行交换.CAS是通过加总线锁或者使用内存锁定在硬件层面实现的. CAS有一些缺点:1. 单个操作能够保证原子性,但是复合操作不能够保证.2. 并发量大的时候会导致大量的循环比较操作消耗性能. 3. ABA问题.会丢失掉一些中间处理过程. 解决ABA问题使用AtomicStampedReference解决,

Java多线程系列---“JUC原子类”01之 原子类的实现(CAS算法)

转自:https://blog.csdn.net/ls5718/article/details/52563959  & https://blog.csdn.net/mmoren/article/details/79185862(含部分修改) 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2)一个线程持有锁会导致其它所有需要此锁的线程挂起. (3)

Java-CAS 与原子类

CAS(Compare and Swap),即比较并替换,实现并发算法时常用到的一种技术. CAS 的思想很简单:三个参数,一个当前内存值 V.旧的预期值 A.即将更新的值 B,当且仅当预期值 A 和内存值 V 相同时,将内存值修改为 B 并返回 true,否则什么都不做,并返回 false. 和 CAS 相关的一个概念是原子操作.原子操作是不可被中断的一个或一系列操作.而 CAS 则是 Java 中保证原子操作的一种方式. 从 Java1.5 开始,JDK 的并发包里就提供了一些类来支持原子操

并发编程之原子类

Java从JDK 1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中 的原子操作类提供了一种用法简单.性能高效.线程安全地更新一个变量的方式. ?? 内部都是采用CAS+volatile实现了无锁并发 这节不讲原理,只讲如何使用. 整体结构 从整体上可以分为5组,分别进行说明 ? 基本类型 使用原子的方式更新基本类型 AtomicInteger:整形原子类 AtomicLong:长整型原子类 AtomicBoolean :布尔型原子类 数