第二章 Java并行程序基础

1、join()的本质是让调用线程wait()在当前线程的对象上
2、Thread.yiedl()会使当前线程让出CPU
3、volatile保证可见性,无法保证原子性(如i++,JAVA高并发程序设计P51)
4、synchronized作用是实现线程间的同步是没一次只有一个线程进入同步块,从而保证线程间的安全性;
     synchroized不能对Interger加锁,interger属于不变对象,i++实际在执行时变成了i=Interger.valueOf(i.intValue()+1)),Interger.valueOf()实际是一个工厂方法,会创建一个新的Integer对象(JAVA高并发程序设计P68)

第三章 JDK并发包

5、synchronized增强版 ReentrantLock,常用方法如下
     lock():获得锁,如果锁已经被占用,则等待
     lockInterruptibly():获得锁,优先相应中断
     tryLock():尝试获得锁,不等待
     tryLock(long time,TimeUnit unit):给定实际内尝试获得锁
     ublock():释放锁
6、重入锁搭档Condition

public class ReenterLockCondition implements Runnable {
public static ReentrantLock lock = new ReentrantLock();
public static Condition condition = lock.newCondition(); @Override
public void run() { try {
lock.lock();
condition.await();
System.out.println("Thread is going on");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
} }
}

7、信号量(semaphore)可以指定多个线程同事访问某一个资源
public class SemapDemo implements Runnable {
final Semaphore semp = new Semaphore(5); @Override
public void run() {
try {
semp.acquire();
Thread.sleep(2000);
System.out.println(Thread.currentThread().getId() + ":done!");
semp.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
} /**
* 总共20个线程,系统会以5个线程一组为单位,依次执行并输出
*
* @param args
*/
public static void main(String args[]) {
ExecutorService executorService = Executors.newFixedThreadPool(20);
final SemapDemo demo = new SemapDemo();
for (int i = 0; i < 20; i++) {
executorService.submit(demo);
}
}
}

8、读写锁 ReadWriteLock

9、倒计时器:CountDownLatch

public class CountDownLatchDemo implements Runnable {
static final CountDownLatch end = new CountDownLatch(10);
static final CountDownLatchDemo demo = new CountDownLatchDemo(); @Override
public void run() { try {
Thread.sleep(new Random().nextInt(3) * 1000);
System.out.println("check complete");
end.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void main(String args[]) throws InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
executorService.submit(demo);
}
//等待检查
end.await();
//发射火箭
System.out.println("Fire!");
executorService.shutdown();
}
}

9、循环栅栏 CyclicBarrier,指计算器可以反复使用,接收一个参数作为barrierAction,当计数器一次计数完成后,系统执行barrierAction

10、Locksupport 线程阻塞工具,可以在线程内任意位置让线程阻塞

线程池

11、四大线程池

  (1) newFixeThreadPool():返回一个固定线程数量的线程池,该线程池的线程数量始终不变,当有一个新的任务提交时,线程池中若有空闲线程,则立即执行,若没有,     则新的任务会被暂存在一个任务队列中,待有线程空闲时,便处理在任务队列中的任务

  (2) newSingleThreadExecutor():返回一个只有一个线程的线程池,,若多个任务被提交到该线程池,任务会被保存在一个任务队列中,待线程空闲,按先入先出的顺序     执行队列中的任务

  (3)newCachedThrePool():返回一个可管局实际情况调整线程数量的线程池,线程池的线程数量不确定,但若有空闲线程可以复用,则会优先使用可复用的线程,若所有线      程均在工作,又有新的任务提交,则会创建新的线程处理任务,所有线程在当前任务执行完毕后,将返回线程池进行复用

  (4)newSingleThreadScheduledExecutorService:返回一个ScheduledExecutor对象,线程池大小为1,周期性执行某个任务

详解:http://www.cnblogs.com/dolphin0520/p/3932921.html

12、submit与execute的区别

  (1)如果提交的任务不需要一个结果的话直接用execute()会提升很多性能

  (2)submit返回执行结果,用get接收;execute不返回结果,可打印堆栈信息
13、fork/join 框架
14、JDK并发容器
  (1) ConcurrentHashMap
  (2)CopyOnWiteArryList
  (3) ConcurrentLinkedQueue

JAVA高并发程序设计笔记的更多相关文章

  1. 《实战java高并发程序设计》源码整理及读书笔记

    日常啰嗦 不要被标题吓到,虽然书籍是<实战java高并发程序设计>,但是这篇文章不会讲高并发.线程安全.锁啊这些比较恼人的知识点,甚至都不会谈相关的技术,只是写一写本人的一点读书感受,顺便 ...

  2. 《实战Java高并发程序设计》读书笔记

    文章目录 第二章 Java并行程序基础 2.1 线程的基本操作 2.1.1 线程中断 2.1.2 等待(wait)和通知(notify) 2.1.3 等待线程结束(join)和谦让(yield) 2. ...

  3. 【实战Java高并发程序设计 7】让线程之间互相帮助--SynchronousQueue的实现

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...

  4. 【实战Java高并发程序设计6】挑战无锁算法:无锁的Vector实现

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...

  5. 【实战Java高并发程序设计 5】让普通变量也享受原子操作

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...

  6. 【实战Java高并发程序设计 4】数组也能无锁:AtomicIntegerArray

    除了提供基本数据类型外,JDK还为我们准备了数组等复合结构.当前可用的原子数组有:AtomicIntegerArray.AtomicLongArray和AtomicReferenceArray,分别表 ...

  7. 【实战Java高并发程序设计 3】带有时间戳的对象引用:AtomicStampedReference

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference AtomicReference无法解决上述问题的根 ...

  8. 【实战Java高并发程序设计 1】Java中的指针:Unsafe类

    是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我 ...

  9. Java高并发程序设计学习笔记(十一):Jetty分析

    转自:https://blog.csdn.net/dataiyangu/article/details/87894253 new Server()初始化线程池QueuedThreadPoolexecu ...

随机推荐

  1. 版本控制之三:SVN合并及解决冲突(转)

    转自 http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2408089.html 接下来,试试用TortoiseSVN修改文件,添加文件,删除 ...

  2. sqoop1.4.6从mysql导入hdfs\hive\hbase实例

    //验证sqoop是否连接到mysql数据库sqoop list-tables --connect 'jdbc:mysql://n1/guizhou_test?useUnicode=true& ...

  3. linux学习(二)linux配置网卡以及常见网络问题排查

    实验环境环境:mac,vmware fusion 一.常用的虚拟机网络连接模式. NAT:推荐方式.它可以使你在切换网络环境(比如在工作中和家里)时,不需要修改虚拟主机的配置,而维持正常的上网功能. ...

  4. 原生JS实现图片放大镜插件

      前  言 我们大家经常逛各种电商类的网站,商品的细节就需要用到放大镜,这个大家一定不陌生,今天我们就做一个图片放大镜的插件,来看看图片是如何被放大的…… 先看一下我们要是实现的最终效果是怎么样的  ...

  5. EM 算法求解高斯混合模型python实现

    注:本文是对<统计学习方法>EM算法的一个简单总结. 1. 什么是EM算法? 引用书上的话: 概率模型有时既含有观测变量,又含有隐变量或者潜在变量.如果概率模型的变量都是观测变量,可以直接 ...

  6. tomcat不编译webapps下的war包的解决办法

    1.首先看看tomcat是否能正常启动,如果启动tomcat一闪而过那么就使用dos命令启动tomcat看看报什么错 如果是端口占用的错误.使用netstat -ano命令查看占用端口的程序 然后用任 ...

  7. 网页加速特技之 AMP

    据统计,40%的人会放弃使用加载时间超过3秒的网站.对于加载慢的页面我也是没耐心等待的,同类型网站那么多,为什么不选择加载速度更快体验更好的呢.为了解决网页加载慢的问题,Google联合数十家技术机构 ...

  8. 如何自学Python?

    ​关于如何自学Python,我也是有话说的.来看看? Python具有丰富和强大的类库,常被称为胶水语言.而且语法简洁而清晰,功能强大且简单易学,因而得到了广泛应用和支持.它特别适合专家使用,也非常适 ...

  9. 两个Xml转换为DataSet方法(C#)

    ///通过传入的特定XML字符串,通过 ReadXml函数读取到DataSet中.protected static DataSet GetDataSetByXml(string xmlData){   ...

  10. 接受第三方app分享的数据

    前段时间公司项目需要一个需求: 把第三方的app分享的数据接受到自己的apk中, 涉及到的第三方app是: Youtube/Amazon/NetFlix, 这些app通过分享功能把当前的信息分享出去. ...