一、线程和进程关系

二、创建方式
1.继承Thread类,重写run方法
2.实现Runable接口,重写run方法
3.使用匿名内部类

三、API接口
start()
currentThread() 获取当前线程对象
getID() 获取当前线程ID Thread-编号 该编号从0开始
getName() 获取当前线程名称
sleep() 休眠线程
stop() 停止线程

四、实例化线程
Thread() 分配一个新的 Thread 对象
Thread(String name) 分配一个新的 Thread对象,具有指定的 name正如其名
Thread(Runable r) 分配一个新的 Thread对象
Thread(Runable r, String name) 分配一个新的 Thread对象

五、守护进程
用户线程,不会随主线程停止而停止
守护线程,随主线程停止也停止,setDaemon(true),设置守护线程
gc线程属于守护线程

六、多线程运行状态

新建状态 Thread thread = new Thread()
就绪状态,等待CPU调度 thread.start()
运行状态 thread.run()
阻塞状态 thread.sleep()
死亡状态 thread.stop()

七、join()方法
join()的作用是让其他的线程变为等待,直到当前线程执行完毕。

八、线程安全问题
多个线程同时共享,同一个全局变量或静态变量,做写操作,可能会发生数据冲突问题。

九、线程安全解决办法
synchronized或使用lock锁

1. 同步代码块,可以是任意对象
synchronized(同一个数据){
可能会发生线程冲突问题
}
2. 同步函数,使用this锁。
3. 静态同步函数,使用字节码文件锁。

九、死锁问题
嵌套同步,导致锁无法释放

十、多线程三大特性
原子性、可见性、有序性。

十一、Java内存模型(JMM)
线程之间的共享变量存储在主内存,每个线程都有一个私有的内地内存,本地内存中存储了该线程以读/写共享变量的副本。本地内存只是一个概念,涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编辑器优化。

十二、Volatile
Volatile关键字解决了线程之间的可见性问题。Volatile强制线程每次读取值都从主内存“取值”。

十三、AtomicInteger原子类
可以通过线程安全的方式操作加减。

十四、volatile与synchronized区别
仅靠volatile不能保证线程的安全性。(原子性)
①volatile轻量级,只能修饰变量。synchronized重量级,还可修饰方法
②volatile只能保证数据的可见性,不能用来同步,因为多个线程并发访问volatile修饰的变量不会阻塞。
synchronized不仅保证可见性,而且还保证原子性,因为,只有获得了锁的线程才能进入临界区,从而保证临界区中的所有语句都全部执行。多个线程争抢synchronized锁对象时,会出现阻塞。
线程安全性
线程安全性包括两个方面,①可见性。②原子性。
仅仅使用volatile并不能保证线程安全性。而synchronized则可实现线程的安全性。

十五、线程间通讯,wait()和notify(),notifyAll()
属于Object方法
wait()可以让当前类锁住的线程从运行状态变为休眠状态,释放锁的资源。
notify()可以让当前类锁住的线程从休眠状态变为运行状态。

一般在线程同步中,同一个锁资源使用。

十六、Lock锁(jdk1.5并发包)
Lock lock = new ReentrantLock();
try{
lock.lock();
lock.unlock();
}catch(){
}

十七、Condition实现和wait()、notify()一样的功能
await();同wait()
signal();同notify()

十八、怎么停止线程
不建议使用stop(),
1、设计while,变量判断退出循环。
2、interrupt()让线程抛出异常。

十九、ThreadLock
为每一个线程提供一个局部变量。
底层实现
Map.put(Thread.currentThread(), Object);

二十、Java并发包
原子类、Lock、并发类

二十一、Vector和ArrayList
实现原理都是通过数组实现,查询速度快,增加、修改、删除速度慢。区别
Vector是线程安全的,ArrayList是线程不安全的。

二十二、HasTable和HasMap
实现原理都是通过链表+数组
HasTable是线程安全的,HasMap是线程不安全的。

二十三、Collection.synchroniedMap()
把非安全的Map集合转为安全的Map。(代理模式)

二十四、ConcurrenHasMap
分段锁,将一个整体拆分成多个小的HasTable,默认分16段。

二十五、CountDownLatch
计数器,可以限制执行顺序。
CountDownLatch countDownLatch = new CountDownLatch(2);
countDownLatch.countDown();每次减1
countDownLatch.countDown();
countDownLatch.await(); 不为0时一直等待

二十六、CyclicBarrier
计数器,当线程数达到一定的数量,并发执行。
CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
cyclicBarrier.await; 等待线程达到5个,一起并发执行

二十七、Semaphore
计数器
Semaphore semaphore = new Semaphore(5); 最大资源数
semaphore.availablePermits(); 判断资源
semaphore.acquire(); 获取资源
semaphore.release(); 释放资源

二十八、并发队列
有界和无界
阻塞队列和非阻塞队列
ConcurrentLinkedDeque,无界非阻塞队列
BlockingQueue,有界阻塞队列

转载请注明出处。
作者:wuxiwei
出处:http://www.cnblogs.com/wxw16/p/8915834.html

Java多线程基础总结的更多相关文章

  1. [转]Java多线程干货系列—(一)Java多线程基础

    Java多线程干货系列—(一)Java多线程基础 字数7618 阅读1875 评论21 喜欢86 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们 ...

  2. Java多线程基础:进程和线程之由来

    转载: Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够 ...

  3. Java 多线程——基础知识

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  4. Java多线程--基础概念

    Java多线程--基础概念 必须知道的几个概念 同步和异步 同步方法一旦开始,调用者必须等到方法调用返回后,才能执行后续行为:而异步方法调用,一旦开始,方法调用就立即返回,调用者不用等待就可以继续执行 ...

  5. Java多线程基础知识总结

    2016-07-18 15:40:51 Java 多线程基础 1. 线程和进程 1.1 进程的概念 进程是表示资源分配的基本单位,又是调度运行的基本单位.例如,用户运行自己的程序,系统就创建一个进程, ...

  6. Java基础16:Java多线程基础最全总结

    Java基础16:Java多线程基础最全总结 Java中的线程 Java之父对线程的定义是: 线程是一个独立执行的调用序列,同一个进程的线程在同一时刻共享一些系统资源(比如文件句柄等)也能访问同一个进 ...

  7. 1、Java多线程基础:进程和线程之由来

    Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...

  8. Java 多线程基础(一)基本概念

    Java 多线程基础(一)基本概念 一.并发与并行 1.并发:指两个或多个事件在同一个时间段内发生. 2.并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在 ...

  9. Java 多线程基础(三) start() 和 run()

    Java 多线程基础(三) start() 和 run() 通过之前的学习可以看到,创建多线程过程中,最常用的便是 Thread 类中的 start() 方法和线程类的 run() 方法.两个方法都包 ...

  10. Java 多线程基础(四)线程安全

    Java 多线程基础(四)线程安全 在多线程环境下,如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线 ...

随机推荐

  1. JAVA_SE基础——17.方法的重载

    方法重载: 方法重载就是方法名称重复,加载参数不同. 具体规范: 一.方法名一定要相同. 二.方法的参数表必须不同,包括参数的类型或个数,以此区分不同的方法体. 1.如果参数个数不同,就不管它的参数类 ...

  2. JavaScript 动态显示当前时间

    代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  3. Python-Cpython解释器支持的进程与线程-Day9

    Cpython解释器支持的进程与线程 阅读目录 一 python并发编程之多进程 1.1 multiprocessing模块介绍 1.2 Process类的介绍 1.3 Process类的使用 1.4 ...

  4. Apollo单向SSL认证(1)

    参考链接:https://www.cnblogs.com/benwu/articles/4891758.html keytool -genkey -alias mybroker -keyalg RSA ...

  5. OAuth是什么?

    一.OAuth的概念 1.问题的提出 2.应用场景 3.规范演进 二.OAuth的运行原理 1.参与者 访问私有数据需要用户参与(客户.用户.服务提供者) 访问公共数据不需要用户参与(客户.服务提供者 ...

  6. Hibernate HQL中的子查询

    子查询是SQL语句中非常重要的功能特性,它可以在SQL语句中利用另外一条SQL语句的查询结果,在Hibernate中HQL查询同样对子查询功能提供了支持.   如下面代码所示: List list=s ...

  7. 页面获取Web控件ID不能正常获取,它惹得祸

    今天碰到个比较奇葩的问题,因为动了一下目标框架,又原来的4.5.1改为3.5,然后又改回来了4.5.1,结果运行项目的时候发现界面js的计算,不能正常获值计算. 于是就开始找问题呗,先是发现这个二手项 ...

  8. 算法 排序lowB三人组 冒泡排序 选择排序 插入排序

    参考博客:基于python的七种经典排序算法   [经典排序算法][集锦]     经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一 ...

  9. typeof与instanceof的区别

    一.instanceof运算符:       此运算符可以判断一个变量是否是某个对象(类)的实例,返回值是布尔类型的.想要理解它的作用,必须对面向对象有所理解: 代码实例如下: var str=new ...

  10. Windows下安装Python3和Django

    下载python3 首先去 python的官网 下载最新稳定版的python3, 我下载的时候python3的最新版本是3.6.5. 亦可点击 此链接 直接下载. 安装python3 傻瓜式安装,注意 ...