一、线程和进程关系

二、创建方式
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. XML之自动生成类,添加,修改,删除类的属性

    1. class ClassHelperDemo { public static void Main() { #region 演示一:动态生成类. //生成一个类t. Type t = ClassHe ...

  2. PHP分页初探 一个最简单的PHP分页代码的简单实现

    PHP分页代码在各种程序开发中都是必须要用到的,在网站开发中更是必选的一项. 要想写出分页代码,首先你要理解SQL查询语句:select * from goods limit 2,7.PHP分页代码核 ...

  3. python全栈开发-logging模块(日记专用)

    一.概述 很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,l ...

  4. Spring Security入门(1-12)Spring Security 的过滤器机制

    Servlet过滤器被用来拦截用户请求来进行请求之前或之后的处理,或者干脆重定向这个请求,这取决于servlet过滤器的功能. Servlet过滤器处理之后的目标servlet是 MVC 分发web ...

  5. maven常见问题处理(3-3)Gradle编译时下载依赖失败解决方法

    Gradle编译时在本地仓库中如果没有发现依赖,就会从远程仓库中下载, 默认的远程仓库为 mavenCentral(),即 http://repo1.maven.org/maven2/往往访问速度特别 ...

  6. 分布式服务框架HSF

    最近在读阿里巴巴中台战略思想与架构这本书,so和大家分享一些我get到的东东. HSF是阿里巴巴内部的分布式服务框架,这个大家都很熟悉了,先上一张HSF的工作原理图: 这个图说明了HSF框架中每个组件 ...

  7. [LuoguP1113] 杂物 - 拓扑排序

    其实只是纪念下第一篇洛谷题解? Description John的农场在给奶牛挤奶前有很多杂务要完成,每一项杂务都需要一定的时间来完成它.比如:他们要将奶牛集合起来,将他们赶进牛棚,为奶牛清洗乳房以及 ...

  8. Struts(十一):OGNL表达式(二)

    Map栈 :request,session,application的一个属性值或一个请求参数的值. 若想访问ContextMap里的某个对象的属性,可以使用以下几种之一: #object.proper ...

  9. 尼姆博弈(Nimm's Game)

    题型: 有3堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取1个,多者不限,最后取光者得胜. 思路 首先自己想一下,就会发现只要最后剩两堆物品一样多(不为零),第三堆为零,那面对这种局 ...

  10. 【转】python3 urllib.request 网络请求操作

    python3 urllib.request 网络请求操作 基本的网络请求示例 ''' Created on 2014年4月22日 @author: dev.keke@gmail.com ''' im ...