Java多线程基础总结
一、线程和进程关系
二、创建方式
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多线程基础总结的更多相关文章
- [转]Java多线程干货系列—(一)Java多线程基础
Java多线程干货系列—(一)Java多线程基础 字数7618 阅读1875 评论21 喜欢86 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们 ...
- Java多线程基础:进程和线程之由来
转载: Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够 ...
- Java 多线程——基础知识
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- Java多线程--基础概念
Java多线程--基础概念 必须知道的几个概念 同步和异步 同步方法一旦开始,调用者必须等到方法调用返回后,才能执行后续行为:而异步方法调用,一旦开始,方法调用就立即返回,调用者不用等待就可以继续执行 ...
- Java多线程基础知识总结
2016-07-18 15:40:51 Java 多线程基础 1. 线程和进程 1.1 进程的概念 进程是表示资源分配的基本单位,又是调度运行的基本单位.例如,用户运行自己的程序,系统就创建一个进程, ...
- Java基础16:Java多线程基础最全总结
Java基础16:Java多线程基础最全总结 Java中的线程 Java之父对线程的定义是: 线程是一个独立执行的调用序列,同一个进程的线程在同一时刻共享一些系统资源(比如文件句柄等)也能访问同一个进 ...
- 1、Java多线程基础:进程和线程之由来
Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...
- Java 多线程基础(一)基本概念
Java 多线程基础(一)基本概念 一.并发与并行 1.并发:指两个或多个事件在同一个时间段内发生. 2.并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在 ...
- Java 多线程基础(三) start() 和 run()
Java 多线程基础(三) start() 和 run() 通过之前的学习可以看到,创建多线程过程中,最常用的便是 Thread 类中的 start() 方法和线程类的 run() 方法.两个方法都包 ...
- Java 多线程基础(四)线程安全
Java 多线程基础(四)线程安全 在多线程环境下,如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线 ...
随机推荐
- Scala 操作符与提取器
实际上Scala没有操作符, 只是以操作符的格式使用方法. 操作符的优先级取决于第一个字符(除了赋值操作符), 而结合性取决于最后一个字符 Scala的操作符命名更加灵活:) 操作符 中置操作符(In ...
- 第二章 Idea搭建maven
第二章 Idea搭建maven 1.配置Maven的环境变量 a.首先我们去maven官网下载Maven程序,解压到安装目录,如图所示: b.配置M2_HOME(MAVEN_HOME)的环境变量,然后 ...
- Mybatis和Hibernate本质区别和应用场景
Hibernate:是一个标准ORM(对象关系映射)框架.入门门槛较高,不需要程序员写sql语句,sql语句自动生成,对sql语句优化.修改比较困难 应用场景:适用于需求变化不多的中小型项目,比如后台 ...
- 09_Python定义方法_Python编程之路
有关Python判断与循环的内容我们上几节已经跟大家一起学习了,这一节我们主要针对def 做一个讲解 def 定义一个方法 在项目编程中,我们往往要做很多重复的事,比如一个排序的功能(当然Python ...
- Spring知识点回顾(07)事件发布和监听
Spring知识点回顾(07)事件发布和监听 1.DemoEvent extends ApplicationEvent { public DemoEvent(Object source, String ...
- css回顾之左侧宽度自适应布局
目标: <!DOCTYPE html> <meta charset=utf-8> <html> <head> <title>alibaba& ...
- Dapper中条件为In的写法
今天用Dapper更新是用到了IN写法,园子里找了篇文章这样写到 传统sql in (1,2,3) 用dapper就这样写 conn.Query<Users>("SELECT * ...
- 《Java面向对象设计》
<Java面向对象设计> 第一章 面向对象软件工程与UML p理解为什么需要软件工程 p掌握软件工程的基本概念 p掌握软件生命周期各个阶段的主要任务 p了解流行软件开发过程 p了解软件过程 ...
- evel()与JSON.parset()的区别
var x=alert("hello")evel("x");eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码:消耗大量内存,尤其是 ...
- 学习css之选择器优先级
相信每一位前端工作者最开始迷惑的地方便是界面展示为什么不符合预期效果呢,下面我来介绍一下可能引起上面结果的原因之一--css优先级. 我这里采用对照法来得出结论,代码如下: <style> ...