一、第一章

1、自定义线程类中实例变量针对其他线程有共享和不共享之分,自定义线程中的变量,如果是继承自thread类,则每个线程中的示例变量的更改,不影响其他线程
2、当多个线程去访问一个局部变量是会产生 非线程安全的问题,需要加synchronize 关键字
3、isAlive() 方法,判断当前的线程是否处于活动状态,已启动,且未终止。
4、sleep() 方法,在指定的毫秒数内,让当前正在执行的线程休眠,但不释放锁
5、停止,中断一个线程,可用stop(已废弃),推荐用interrupted() isInterrupted() 用来判断线程是否终止
6、suspend() 暂停一个线程 需要用resume() 方法来恢复线程的执行,不过该方法已经不鼓励使用
7、线程的优先级分为 1~10 这10 个级别,如果小于1 或者大于10 则抛出异常,setPriority(n) ,n 代表优先级别,数字越大,优先级越高。

二、第二章

1、非线程安全的问题存在于实例变量中,方法内部的私有变量,是不存在非线程安全问题的
2、实例变量中的非线程安全问题,可以通过添加synchronized 关键字来解决,使得多个线程顺序执行
3、关键字synchronized 取得的锁都是对象锁,而不是一段代码或者方法当作锁,哪个线程先执行带有该关键字的方法,哪个线程就持有该方法所属对象的锁Lock
4、只有共享资源的读写访问才需要同步化,如果不是共享资源,根本没有同步的必要
5、关键字synchronized 拥有锁重入功能,也就是在使用该关键字时,当一个线程得到一个对象锁后,再次请求此对象锁 时,是可以得到该对象的锁的,也就是说一个synchronized方法或者块的内部调用本类的其他synchronized方法或者块时,是永远可以得到锁的。
6、synchronized 关键字修饰的方法是对当前对象进行加锁,而synchronized代码块是对某一个对象进行加锁

7、同步代码块 synchronized(this){} 代码块也是锁定的当前对象
8、互斥的代码需要放在synchronized修饰的代码块中,synchronized(obj){} 根据互斥的obj的不同,将互斥分为不同的互斥组。
9、要用到的共同数据包括同步锁或者共同算法的若干个方法应该归类到同一个类中,体检高内聚和程序的健壮性
10、volatile 关键字的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。读取原子性,更新不是原子性,会有线程安全的问题。

11、Callable跟Runnable类似,可以配合线程池来使用,Callable的call 方法 可以有返回值,通过Future的get()方法来获取,也可以提交一组任务,然后通过,CompletionService.take().get()方法来获取
12、显示锁Lock 实现类为ReentrantLock, 和关键字synchronizd 功能一致,通过lock()方法来实现同步的控制,通过unlock()方法来释放锁
13、读写锁 ReadWriteLock ,多个读锁不互斥,读锁和写锁互斥,写锁和写锁互斥
实现类为ReentrantReadWriteLock 用法
newReentrantReadWriteLock().readLock().lock();
newReentrantReadWriteLock().readLock().unlock();
newReentrantReadWriteLock().writeLock().lock();
newReentrantReadWriteLock().writeLock().unlock();
14、Condition 可以用来替代wait()和notify()方法,必须跟ReentrantLock一起使用
用法:
Lock lock=ReentrantLock();
Condition condition=lock.newCondition();
condition.await(); //等价于wait()方法
condition.signal();//等价于notify()方法
15、semaphore 信号量,控制并发数,也就是控制同时访问资源的线程个数
用法:
Semaphore sem=new Semphore(3);//三个并发数
sem.acquire();//获取信号量
sem.release();//释放信号量
sem.availablePermits();//返回可以使用的信号量数
16、CyclicBarrier 一组线程全部等待彼此达到共同屏障点,当给定数量的线程(线程)正在等待时,它将跳闸,用法:
CyclicBarrier cb =new CyclicBarrier(3);
cb.await();
cb.await();
cb.await();
当有三个 cb.await()时,将进行下一步计划。
17、CountDownLatch 倒计时器,当计数器值减为0 时,等待的现象横将执行下一步操作
通过调用await()方法阻塞,直到由于countDown()方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的await() 调用立即返回
CountDownLatch cdl=new CountDownLatch(1);
CountDownLatch cdl2=new CountDownLatch(3);
cdl.await();//等待
cdl2.countDown();//减1
cdl2.countDown();//减1
cdl2.countDown();//减1
cdl.countDown();//减1
18、Exchanger 实现两个线程的数据交换
等待另一个线程到达此交换点,然后将给定对象传输给它,接收其对象作为回报。

java多线程编程核心技术-笔记的更多相关文章

  1. 《Java 多线程编程核心技术》- 笔记

    作为业务开发人员,能够在工作中用到的技术其实不多.虽然平时老是说什么,多线程,并发,注入,攻击!但是在实际工作中,这些东西不见得用得上.因为,我们用的框架已经把这些事做掉了. 比如web开发,外面有大 ...

  2. Java多线程编程核心技术---学习分享

    继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...

  3. Java多线程编程核心技术---对象及变量的并发访问(二)

    数据类型String的常量池特性 在JVM中具有String常量池缓存的功能. public class Service { public static void print(String str){ ...

  4. Java多线程编程核心技术

    Java多线程编程核心技术 这本书有利于对Java多线程API的理解,但不容易从中总结规律. JDK文档 1. Thread类 部分源码: public class Thread implements ...

  5. 《Java多线程编程核心技术》推荐

    写这篇博客主要是给猿友们推荐一本书<Java多线程编程核心技术>. 之所以要推荐它,主要因为这本书写得十分通俗易懂,以实例贯穿整本书,使得原本抽象的概念,理解起来不再抽象. 只要你有一点点 ...

  6. 《java多线程编程核心技术》(一)使用多线程

    了解多线程 进程和多线程的概念和线程的优点: 提及多线程技术,不得不提及"进程"这个概念.百度百科对"进程"的解释如下: 进程(Process)是计算机中的程序 ...

  7. Thread.currentThread()和this的区别——《Java多线程编程核心技术》

    前言:在阅读<Java多线程编程核心技术>过程中,对书中程序代码Thread.currentThread()与this的区别有点混淆,这里记录下来,加深印象与理解. 具体代码如下: pub ...

  8. Java多线程编程核心技术(三)多线程通信

    线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...

  9. Java多线程编程核心技术(二)对象及变量的并发访问

    本文主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题.阅读本文应该着重掌握如下技术点: synchronized对象监视器为O ...

随机推荐

  1. [Scala]Scala学习笔记二 数组

    1. 定长数组 如果你需要一个长度不变的数组,可以使用Scala中的Array. val nums = new Array[Int](10) // 10个整数的数组 所有元素初始化为0 val str ...

  2. Python探索记(18)——文件File

    # @Time : 2017/7/8 21:10 # @Author : 原创作者:谷哥的小弟 # @Site : 博客地址:http://blog.csdn.net/lfdfhl # @DESC : ...

  3. MySQL 福利彩票业务 如何存储毫秒微秒

    朋友在做福利彩票业务,遇到一个存储毫秒微秒数据的需求,问我mysql里面有何解决方案.我脑中一搜索,以前没有关注到,于是去官网查看,找到11.3.6 Fractional Seconds in Tim ...

  4. Django 之Ajax

    必备知识:json 什么是json 定义 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式. 它基于 ECMAScript (w3c制定的 ...

  5. GitLab non-standard SSH port

    /***************************************************************************** * GitLab non-standard ...

  6. (十一)java循环结构

    while(循环的条件) {循环的语句} int a = 1; while(a < 5) { System.out.println(a);//1,2,3,4 a++; } System.out. ...

  7. Lumen实现用户注册登录认证

    Lumen实现用户注册登录认证 前言 Lumen是一个基于Laravel的微框架,号称是以速度为生.截用Lumen官网的一段,号称是比silex和slim还要快. 本文将用Lumen来实现一个完整的用 ...

  8. C++之指针使用

    C++指针使用的好坏直接反映了编程人员水平的高低,下面从指针和数组的区别.指针参数是如何传递内存.野指针.malloc/free.new/delete和内存耗尽怎么办方面进行总结. 一 指针和数组对比 ...

  9. 后台导入导出Excel

    Excel导出 定义数据模型 参考财付通的批量提现Excel的格式,定义模型如下 private int recordId; //提现id private String cname; //提现人名称 ...

  10. 2、通过HBase API进行开发

    一.将HBase的jar包及hbase-site.xml添加到IDE 1.到安装HBase集群的任意一台机器上找到HBase的安装目录,到lib目录下下载HBase需要的jar包,然后再到conf目录 ...