进程是程序的一次执行过程,是系统运行程序的基本单位。
线程是更小的执行单位,多个线程共享进程的堆和方法区资源。
一个进程可以有多个线程,多个线程共享进程的堆和方法区。
线程的生命周期和状态初始状态:线程被构建,但是还没开始
运行状态:就绪和运行统称为运行中
阻塞状态:线程阻塞于锁
等待状态:线程进入等待状态
超时等待:可以在指定时间自行返回
终止状态:线程已经执行完毕。
线程创建后处于新建状态,调用start方法开始运行,处于可运行状态,如果获得了时间片就得到了运行状态。当线程执行wait方法的时候进如等待状态,需要其他线程通知才能返回运行状态。超市等待是在等待的基础上增加了时间限制,通过sleep方法或者wait方法可以置于好事等待方法。超市时间到达进行运行状态,当线程同步的时候,没有获取到锁,进入阻塞状态。在执行run方法后进入终止状态。
线程死锁多个线程同时阻塞在等待资源
互斥条件:一个资源只能由一个线程战友
请求与保持:一个线程请求资源的时候对已经获得的资源保持不放
不剥夺条件:线程已经获得资源不能被强行剥夺
循环等待:一个线程等待着另一个线程形成循环
破坏死锁:
破坏形成线程的条件
银行家算法
sleep和wait方法sleep没有释放锁,wait释放了锁
sleep用于展厅执行,执行完成了,线程会自动苏醒。wait用于线程交互,如果调用后 不会自动苏醒,需要notify唤醒
为什么调用start会执行run,而不能直接调用run调用satrt可以启动线程并进入就绪状态,直接执行run会不会以多线程方法执行。
synchronize用于线程同步,表示被修饰的在任意时刻只能有一个线程执行
修饰实例方法、修饰静态方法、修饰代码块
构造方法本身就是线程安全的不需要修饰
synchronize 和reentrantlock的区别两者都是可重入锁
synchronize依赖于JVM,reentrantlock依赖于API
reentrantlock等待可冲段,可以实现公平锁或者非公平锁,可以通知
synchronize和volatilevolatile是线程同步的轻量级实现,只能用于变量。
可以保证数据的可见性,但是不能保证原子性
主要用于解决变量在多个线程的可见性。sync用于放问资源的同步性。



