>JUC ? 就是Java API 中这三个包的简称:

>atomic 包

CAS:compare and swap ?要实现原子性操作

这是一种原子性操作,这是一种原子性赋值,

比如原来的 ++i ,现在对 i 进行原子性加一,从Java5之后就有了这个原子性操作,主要借助unsafe类(源码无法查看),Java为我们封装了一些类:

在atomic 包中

之前的例子改一下:

public class TestAtomic {V v = new V();public static void main(String[] args) {TestAtomic ta = new TestAtomic();ta.go();}private void go() {for (int i = 0; i < 3; i++) {new Thread(new Runnable() {public void run() {for (int j = 0; j < 10000; j++) {v.add();}}}).start();}while (Thread.activeCount() > 1) {}System.out.println(v.ai.get());}class V {//public int i = 0;public AtomicInteger ai=new AtomicInteger();public void add() {//原本在这个地方加个锁,将整个方法锁住了,悲观锁(重量级锁)//如果i++ 变成原子性的就没必要在外部加锁了//i++;ai.getAndIncrement();}}
}

>locks 包

1.重入锁基本使用:

public class TestLock {public static void main(String[] args) {new TestLock().go();}public void go() {V v = new V();new Thread(new Runnable() {public void run() {while (true) {v.printString("AAAAAAAAAAAAAA");}}}).start();new Thread(new Runnable() {public void run() {while (true) {v.printString("BBBBBBBBBBBBBB");}}}).start();}class V {// 使用Lock 代替 synchronizedReentrantLock lock = new ReentrantLock();public void printString(String str) {try {lock.lock();for (int i = 0; i < str.length(); i++) {System.out.print(str.charAt(i));}System.out.println();} catch (Exception e) {} finally {// 为了确保锁可以被释放掉lock.unlock();}}}
}

2.条件锁:使用条件锁实现线程轮询

public class TestConditionLock {V v = new V();public static void main(String[] args) {TestConditionLock t = new TestConditionLock();t.go();}private void go() {new Thread(new Runnable() {@Overridepublic void run() {while (true) {v.f1();}}}).start();new Thread(new Runnable() {@Overridepublic void run() {while (true) {v.f2();}}}).start();new Thread(new Runnable() {@Overridepublic void run() {while (true) {v.f3();}}}).start();}class V {Lock lock = new ReentrantLock();Condition condition1 = lock.newCondition();Condition condition2 = lock.newCondition();Condition condition3 = lock.newCondition();int token = 1;public void f1() {lock.lock();try {while (token != 1) {try {condition1.await();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}token = 2;System.out.println(Thread.currentThread().getName() + "--f1");condition2.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void f2() {lock.lock();try {while (token != 2) {try {condition2.await();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}token = 3;System.out.println(Thread.currentThread().getName() + "--f2");condition3.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void f3() {lock.lock();try {while (token != 3) {try {condition3.await();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}token = 1;System.out.println(Thread.currentThread().getName() + "--f3");condition1.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}}
}

3.读写锁:

读写锁分为读锁和写锁。多个读锁之间不互斥、读锁和写锁之间互斥、写锁和写锁之间互斥。这一功能很重要,对并发读取提高了性能。

读写锁使用到了JUC中的ReentrantReadWriteLock类:

/*** 测试读写锁: 1.有个地方存东西 2.提供读和写两个方法,对这两个地方进行操作 3.开启多个线程,有读,有写 4.证明读的时候可以读,写的时候不能其他操作*/
public class TestReentrantReadWriteLock {public static void main(String[] args) {TestReentrantReadWriteLock t = new TestReentrantReadWriteLock();t.go();}Data d = new Data();Random r = new Random();private void go() {for (int i = 0; i < 3; i++) {new Thread(new Runnable() {@Overridepublic void run() {d.write(r.nextInt(1000));}}).start();}for (int i = 0; i < 5; i++) {new Thread(new Runnable() {@Overridepublic void run() {d.read(r.nextInt(999));}}).start();}}class Data {List<Integer> list = new ArrayList<>();{for (int i = 0; i < 1000; i++) {list.add(i);}}// 创建读写锁ReadWriteLock lock = new ReentrantReadWriteLock();Lock readLock = lock.readLock();Lock writeLock = lock.writeLock();public void read(int index) {readLock.lock();try {System.out.println(Thread.currentThread().getName() + "进入读方法");try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}int i = list.get(index);System.out.println(Thread.currentThread().getName() + "读到数据" + i);System.out.println(Thread.currentThread().getName() + "读取完毕");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {readLock.unlock();}}public void write(int data) {writeLock.lock();try {System.out.println(Thread.currentThread().getName() + "进入写方法");try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}list.add(data);System.out.println(Thread.currentThread().getName() + "写入完毕");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {writeLock.unlock();}}}
}

显示:

Thread-0进入写方法
Thread-0写入完毕
Thread-1进入写方法
Thread-1写入完毕
Thread-2进入写方法
Thread-2写入完毕
Thread-3进入读方法
Thread-4进入读方法
Thread-5进入读方法
Thread-6进入读方法
Thread-7进入读方法
Thread-4读到数据403
Thread-5读到数据276
Thread-5读取完毕
Thread-7读到数据98
Thread-7读取完毕
Thread-6读到数据628
Thread-6读取完毕
Thread-3读到数据258
Thread-3读取完毕
Thread-4读取完毕

数据库中有表级别锁,行级锁,如何实现?思考。

单例模式中的同步代码块如何取代:

先看API实例:

class CachedData {Object data;volatile boolean cacheValid;final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();void processCachedData() {rwl.readLock().lock();if (!cacheValid) {// Must release read lock before acquiring write lockrwl.readLock().unlock();rwl.writeLock().lock();try {// Recheck state because another thread might have// acquired write lock and changed state before we did.if (!cacheValid) {data = ...cacheValid = true;}// Downgrade by acquiring read lock before releasing write lockrwl.readLock().lock();} finally {rwl.writeLock().unlock(); // Unlock write, still hold read}}try {use(data);} finally {rwl.readLock().unlock();}}}

改造一下单例:

public class Book {private static Book instance = null;private static ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();public static Book getInstance() {try {rwl.readLock().lock();if (instance == null) {rwl.readLock().unlock();rwl.writeLock().lock();if (instance == null) {instance = new Book();}rwl.readLock().lock();rwl.writeLock().unlock();}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {rwl.readLock().unlock();}return instance;}
}

Java 并发(JUC 包-01)相关推荐

  1. Java并发编程包中atomic的实现原理

    转载自   Java并发编程包中atomic的实现原理 这是一篇来自粉丝的投稿,作者[林湾村龙猫]最近在阅读Java源码,这一篇是他关于并发包中atomic类的源码阅读的总结.Hollis做了一点点修 ...

  2. JAVA并发类包介绍

    JAVA并发Apl介绍合集 1. java.util.concurrent包 1.1 Executors线程池 1.2 Queues队列 1.3 Concurrent Collections 1.4 ...

  3. Java多线程 -- JUC包源码分析2 -- Copy On Write/CopyOnWriteArrayList/CopyOnWriteArraySet

    本人新书出版,对技术感兴趣的朋友请关注: https://mp.weixin.qq.com/s/uq2cw2Lgf-s4nPHJ4WH4aw 上1篇讲述了Java并发编程的第1个基本思想–CAS/乐观 ...

  4. java并发-JUC

    CAS 无锁,乐观锁,自旋锁,轻量级锁 定义 Compare and Swap,是基于硬件级别的指令实现的同步原语,Java并发包java.utile.concurrent许多同步类基于CAS构建 c ...

  5. Java并发JUC(java.util.concurrent)集合不安全

  6. 6.juc包下的原子类AtomicInteger,AtomicLong等AtomicXXX介绍

     在介绍juc中的原子类之前,先看看官方文档对java.util.concurrent.atomic包的介绍官方文档地址这里截取翻译之后的部分描述 1. 支持对单个变量进行无锁线程安全编程 2. 类的 ...

  7. 多线程十 JUC包下的常用工具类

    JUC包下的常用工具类 1. CountDownLatch-闭锁 2. CyclicBarrier-循环栅栏 3. Semaphore-信号量 4. Exchanger-线程数据交换器 这篇文章主要是 ...

  8. JAVA并发编程JUC基础学习(简介)

    2019独角兽企业重金招聘Python工程师标准>>> 之前写过一篇并发编程的简单实例应用,Future快速实现并发编程,可以很快的在自己的项目中应用,但并不系统,之前说过总结一篇( ...

  9. java并发编程(二十一)----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍

    转载自  java并发编程(二十一)----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍 这一节我们来接着介绍JUC集合:CopyOnWrite ...

最新文章

  1. 8088/8086的功能结构
  2. 清华大学董胤蓬:Adversarial Robustness of Deep Learning
  3. 超燃!Apache Flink 全球顶级盛会强势来袭[视频+PPT]
  4. Callable和Future、FutureTask的使用
  5. [C#7] 1.Tuples(元组)
  6. 【数据库原理及应用】经典题库附答案(14章全)——第七章:数据库恢复技术
  7. 互联网为什么要版权,我支持资源共享。
  8. Linux下记住Gitee账户密码
  9. 苏宁大数据怎么运营_18个“硬核”数据告诉你,苏宁大数据如何火力全开护航618!...
  10. servlet的doPost 和doGet和web文件结构
  11. pom文件中的dependencyManagement和dependency
  12. 方法重写和重载的区别
  13. 董桥《南山雨》(选自:旧时月色)
  14. Windows XP SP3 升级故障汇总
  15. 如何给网站添加IE浏览器升级提示
  16. 网站结构优化要做好哪些
  17. “org.springframework.beans.factory.BeanCreationException: Error creating bean with name xxx“问题解决
  18. 用Sublime Text3编写java程序
  19. 图漾相机-TM461-E2(TM460-E2) TOF相机
  20. linux 增加静态路由命令

热门文章

  1. 计算机网络引言,[计算机网络]Ch.1引言
  2. grep sed awk三剑客详解
  3. mongodb运算符使用
  4. ASP.NET MVC实践系列1-UrlRouting
  5. cannot mount database in EXCLUSIVE mode
  6. MYSQL SELECT 过程 转
  7. protobuf 向前兼容向后兼容
  8. BI/数据仓库/数据分析 基础入门:一些常见概念解释
  9. .Net 自定义应用程序配置 configSections
  10. 太阳能传感器目前主要故障问题解决方案