案例源码前往:结合源码更直观多线程案例源码
https://download.csdn.net/download/weixin_48019148/86223722
什么是进程?到底什么是进程?

应用程序,什么使应用程序?
可执行的软件,qq、yy、快播。在一个应用程序中,都会有进程。
什么是进程?
进程中有多个不同执行路径。
多个进程的集合
进程市执行中的册灰姑娘徐
一个操作系统可以有进程
在进程中,程序代码是怎执行的?
代码的执行顺序靠那个线程?
在进程中,一定有一个进程,这个线程就是主线程。main
什么是线程?
一个执行顺序,一个执行流程、执行路径。
总结:
使用多线程,提高程序效率。使用多线程,每个程序互不影响,因为都在自己独立运行。
什么是进程,进程就是正在运行的程序,它是线程集合
什么是线程,就是正在独立运行的一条执行路径
什么是多线程,就是为了提高程序的效率
为什么使用多线程?
例子:

多线程的应用场景
多线程下载、qq、爬虫、前端开发ajax(异步上传)、分布式、job(需要同时一个执行多个任务调度)、使用多线程体现程序的效率。
什么是同步?什么是异步?(很重要)
同步:代码从上往下执行(单线程) 缺点:方法一执行完才能执行方法二,方法一出错方法二不执行

异步:两条路径同时执行 防跳执行路径不会相互影响

线程常见的几种方式(程序附:thread_demo01中TreadDemo02-04)
* 1、使用继承Thread类方式
* 2、使用实现runlabe
使用继承方式创建县城好呢?还是使用接口方式好呢?
开发都是以面向接口编程
* 3、使用匿名内部类方式
* 4、callable
* 5、使用线程池创建(企业中)线程中常见的集中API
什么是守护线程、非守护线程?
和main相关。
守护线程有一个特征:和主线程一起销毁
非守护线程特征:和主线程互不影响
用户线程:
用户自己创建的线程,,如果主线程停止掉,不会影响用户线程
用户线程也叫非守护线程
gc线程:
属于守护线程,和主线程一起销毁
join()的使用(程序附:thread_demo01中Tread005)
程序正在执行线程A,另一个线程B,线程A调用线程B的join()方法。作用:线程A会停止执行,等待线程B执行之后(交出我的CPU执行权),在执行。
程序附:Tread005
练习:(程序附:thread_demo01中Test01)
现在有T1,T2,T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行。
多线程的几种状态
新建状态
准备状态
运行状态
休眠状态
停止状态

多线程之间实现同步
什么是线程安全问题?
答:当多个线程共享一个全局变量,做写操作的时候,可能会受到其他线程的干扰,导致数据有问题,这种现象叫做线程安全问题
现实中的例子:
两个男孩同时喜欢一个女孩,当两个男孩同时想约这个女孩的时候,就会发生冲突。就相当于线程安全问题。

案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果(程序附:thread_demo02中ThreadDemo)
线程安全问题几种解决办法
线程之间如何实现同步?
答:多个线程共享同一个全局变量,线程安全问题------保证数据的原子性
解决办法
synchroized--自动:同步代码块((程序附:thread_demo02中ThreadDemo))
必须有一些条件:
1、必须要有两个线程以上,需要发生同步。
2、多个线程想同步,必须用同一吧锁。
3、保证只有一个线程进行执行。
缺点:效率非常低,强所得资源
好处:解决了线程安全问题
原理:
1、有一个线程已经拿到了锁,其他线程已经有cpu执行全的,一直排队,等待其他线程释放锁。
2、锁是什么时候释放?代码执行完毕或者是程序抛出异常都会被释放掉。
3、锁已经被释放掉的话,其他线程开始获取锁进去同步中去
4、锁的资源竞争。
5、死锁问题

jdk1.5并发包--手动
synchroized什么地方需要考虑到加锁?
真正产生共享同一个全局变量的时候
同步代码块(程序附:thread_demo02中ThreadDemo)
同步函数:(程序附:thread_demo02中ThreadDemo01)
同步函数使用的是this锁证明:如果这两个线程实现了同步说明同步函数使用的是this锁
两个线程之间实现同步,一个线程使用this锁同步代码块,一个线程使用同步函数。
在方法上面加上synchroized同步函数
非静态同步函数
同步函数使用的是this锁
静态(static关键字)同步函数
静态同步函数使用的是节码文件锁
加锁保证同步,同步是保证数据安全问题源子问题
分布式锁、高并发和jvm是没有任何关系
使用syn,lock都属于当前jvm中同步
多线程死锁(程序附:thread_demo02中ThreadDemo02)
多线程死锁现象,同步中嵌套同步,无法释放。一直等待,变成死锁

多线程的三大特性
原子性:保证线程独一无二、一致性,保证线程安全问题
可见性:个人理解就是当一个线程对主内存中的变量进行写操作后,主内存会通知其他线程变量值已经修改
有序性:join,wait,notfi(多线程之间通讯)
java内存模型
什么是Java内存模型?Java内存结构?
Java内存模型属于多线程可见性jmm
Java内存结构属于jvm内存分配
Java内存模型决定了一个线程和另一个线程是否可见。
java内存模型:------有关线程安全问题
主内存:主要存放共享的全局变量
私有本地内存:存放本地线程私有变量

线程安全问题在内存中的解读:在主内存中创建一个全局变量,此时创建两个线程分别是t1和t2,当线程t1执行时他从主内存中获取到变量count的副本,count的初始值为0,此时线程t1he她同时拿到主线程的变量count且都等于0,复制存放到各自的本地私有内存中,首先,线程t1对本地私有内存中count的副本进行加一操作,那么此时t1的本地私有内存中的count副本的值为1,t1将私有本地内存的count副本的值刷新给主内存的count值,那么主内存的值此时变为1。但是同时线程t2不会接收到主线程中变量值的变化,线程t2依然会对最开始拿到的变量副本进行操作,也就是count=0。当线程t2也对count进行加1操作完成,并同时为主内存更新count值。这时就产生了线程安全问题。
Vollatile关键字(程序附:thread_demo02中TreadVolatileDemo)
作用:保证线程之间可见,但不保证原子问题.
可以使用jdk1.5中的并发包解决计数问题(程序附:thread_demo02中VolatileNoAtomic)