0.线程是操作系统的概念而不是java概念
1.线程是执行java程序代码的基本单位
2.Java线程也是Java平台的一部分
3.Java线程是运行在平台内部的,Java平台负责管理Java线程
4。当线程执行完方法后就会退出。Java平台中如果没有正在运行的线程,就代表执行完毕,Java平台也就退出了。
类比演奏会模型
·新线程的创建和启动时Java代码触发的。
·Thread类的start()方法是用来启动一个线程的
·Thread类的run()方法是一个线程启动后执行的方法
·一个程序运行多个线程时,速率是随机的
【线程同步】
概念:多个线程在同时执行的时候,如何互相进行协调
在多线程环境下,保证变量是由某个线程独享的
synchronized
关键字,是方法的修饰符,被修饰的方法称之为同步方法,在一个类的实例中,每次只能有一个线程执行此类中的同步方法。
【锁】
线程同步的实现机制 类锁和对象锁
1.线程1获得某对象的对象锁
2.线程1执行了同步方法 。。。。
3.线程2发现某对象的对象锁已经被其他线程拿走了,挂起等待
4.线程1执行完毕,释放对象锁
【线程之间的通信】
1.【共享内存机制】同步-多个线程通过synchronized关键字
2.【共享内存机制】while轮询,线程A不断地改变条件,线程B则在while语句中检测条件是否成立,从而实现线程之间的通信。坏处:浪费CPU资源,还有可能造成死循环
3.【消息传递机制】wait/notify机制,未满足条件是A调用wait()放弃CPU,进入阻塞状态;满足时,B调用notify()通知A,唤醒A并进入可运行状态
4.【消息传递机制】管道通信
【线程安全简介】
一个对象是否是线程安全的取决于它是否会被多个线程访问
当多个线程访问一个类的时候,如果不用考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步及协调,这个类还能做出正确行为,那么称该类是线程安全的。
线程安全的类封装了任何必要的同步,因此客户不需要自己提供
无状态对象永远是线程安全的
原子性是指一个操作是不可中断的,为了保证线程安全操作必须原子地执行
【volatile】
volatile修饰的变量值直接存在main memory里面,子线程对该变量的读写直接写入main memory,而不是像其它变量一样在local thread里面产生一份copy。volatile能保证所修饰的变量对于多个线程可见性,即只要被修改,其它线程读到的一定是最新的值
关于多线程的理解最好是建立在理解Java内存模型的基础上