线程基础特点
1、方法内部变量是线程安全的
2、实例变量非线程安全(对象属性)
3、synchronized锁的是对象,并不是方法或者代码块
4、synchronized锁可重入。同一个线程对同一对象锁可以多次获得。
5、加锁的代码出现异常时,自动释放锁
6、volatile主要作用是让变量在多个线程之间变得可见。它保证有序性,与可见性,但不保证原子性。
7、synchronized非静态方法与synchronized static方法持有的锁是不一样的。一个是对象锁,一个是Class锁,而Class可以对类的所有对象实例起作用。
synchronized(class)与synchronized static方法的作用是一样的。
线程的几种状态
新建(New)、可运行(Runable)、运行中(Running)、阻塞(Blocking)、结束(Died)
api
static sleep():让当前线程休眠指定的时间,休眠过程中不释放锁。
static yield():方法的作用是让出当前CPU资源,但是让出时间不确定,有可能刚让出又马上获得CPU时间片。
join():等待调用线程运行完成,在继续运行当前线程。
在main方法中运行t1.join();表示主线程(main)等待子线程(t1)运行完成之后在运行join方法后的代码。join方法调用要在线程启动之后,否则不生效。
等待与通知
Object类的三个方法:
wait():该方法的作用是使当前线程进行等待。
notify():唤醒处于等待状态的一个线程,如果有多个随机唤醒一个。
notifyAll():唤醒所有等待的线程。
Condition类的三个方法:
await()等价于wait()
signal()等价于notity()
signalAll()等价于notifyAll()
注意:
wait方法会释放锁;
这三个方法必须在synchronized方法或者synchronized块中调用否则抛异常;
必须为同一对象调用wait()、notify()、notifyAll(),否则通知不成功。一般为锁对象进行调用。
线程中断
interrupt()线程终止,但调用此方法的线程并不会停止,它仅仅是给线程添加一个状态标志,通过标志记去做终止线程的操作;
interrupted()静态方法,判断当前线程是否已中断,执行后清除具有将状态标志清除置为false的功能;
isInterrupted()判断线程对象是否已经是中断状态,但不清除状态标志。