两种方法创建线程
- 继承Thread 类并覆盖 run方法。
- 通过实现Runnable接口创建。
线程的生命周期
线程调度
等待
睡眠
让步与优先级
线程合并
守护线程
同步锁
1.同步锁会对****多线程情况****下的程序执行效率产生一定的影响
2.同步锁只能用在代码块或者方法上,不存在类的同步和属性的同步。
3.线程睡眠时,它所持的任何锁都不会释放。
4.同步代码块的使用
(1)把会受到并发影响的都通通包裹起来
(2)同步代码块之前可以做一些具有共性的操作,或者不影响数据的操作;同步代码块之后的内容,会受到同步等待的影响
(3)某一个线程,可以同时拥有多个对象的锁;同时拥有多个对象锁的情况下,有可能会产生****死锁****,虽然这个概率极低,但是只要有这种可能性存在,那么就必须考虑周全。避免发生死锁,需要时刻记着多个对象持锁的顺序。
(4)静态方法的同步代码块,同步的是类,不是对象
(5)静态和非静态同步最好不要混用
锁提供了两种主要特性
互斥(mutual exclusion) 和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 。如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。
volatile