一、第一章

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. 【转】Hibernate 原汁原味的四种抓取策略

    最近在研究 Hibernate 的性能优化的时候碰到了"抓取策略", 由于以前没有详细的研究过, 所以到处找资料, 但是无论从一些讲 Hibernate 书籍,还是他人 Blog ...

  2. 剑指offer--30.二叉搜索树的后序遍历序列

    正常情况下,因为二叉搜索树,左子树所有结点比根小,右子树所有结点比根大,所以循环一遍就能结束 ----------------------------------------------------- ...

  3. Django与数据库操作

    Django与数据库操作 数据库连接的方法 web 框架 django --- 自己内部实现 (ORM) + pymysql(连接) Flask,tornado --- pymysql SQLArch ...

  4. 用php实现四种常见的排序算法

    几种常见的排序 排序是一个程序员的基本功,对于初级phper,更是可以通过排序算法来锻炼自己的思维能力. 所谓排序,就是对一组数据,按照某个顺序排列的过程.下面就总结四种常用的php排序算法,分别是冒 ...

  5. Gif图片验证码类

    新开发的安全验证码类,支持生成Gif图片验证码(带噪点,干扰线,网格,随机色背景,随机自定义字体,倾斜,Gif动画). 上图: 字体及字体文件的路径需要在类中$FontFilePath及$FontFi ...

  6. Python判断unicode是汉字,数字,英文,或者其他字符

    功能: 判断unicode是否是汉字,数字,英文,或者是否是(汉字,数字和英文字符之外的)其他字符. 全角.半角符号相互转换. 全角.半角? 全角--指一个字符占用两个标准字符位置. 汉字字符和规定了 ...

  7. Oracle 实用技巧

    一.rlwrap 在 linux中使用sqlplus对数据库进行操作,常常由于敲错命令或需要反复执行某条语句,需要像linux本身有的历史回调的功能, rlwrap 可以用来支持oracle下sqlp ...

  8. django初探-创建简单的博客系统(一)

    django第一步 1. django安装 pip install django print(django.get_version()) 查看django版本 2. 创建项目 打开cmd,进入指定目录 ...

  9. 由于出现操作系统错误 3,进程无法读取文件D:\XXXX\X.pre (源: MSSQL_REPL,错误号: MSSQL_REPL20024)

    最近着手做SqlServer2008的订阅发布,起初使用推送订阅很顺利,后来改成请求订阅出现了以下问题,折腾好长时间终于搞定,留下此文备日后查阅,或供遇相同问题的道友参考: 首先阐述以下问题: 1. ...

  10. #503. 「LibreOJ β Round」ZQC 的课堂 容斥原理+Treap

    题目: 题解: 比较容易发现 : \(x,y\) 的贡献是独立的. 所以可以分开考虑. 假设我们考虑 \(x\).向量在 \(x\) 方向的投影依次是 : \(\{a_1,a_2, ... ,a_n\ ...