1. 程序次序规则:在一个线程内,按照程序代码顺序,书写在前面的操作先行发生于书写在后面的操作 。准确的说,应该是控制顺序而不是程序代码顺序,因为要考虑分支 。循环等结构
2. 管程锁定规则:一个unlock操作先行发生于后面对同一个锁的lock操作 。这里必须强调的是同一个锁,而后面的是指时间上的先后顺序
3. Volatile变量规则:对一个volatile变量的写操作先行发生于后面对这个变量的读操作,这里的后面同样是指时间上的先后顺序
4. 线程启动规则:Thread对象的start()方法先行发生于此线程的每一个动作
5. 线程终止规则:线程中的所有操作都先行发生于对此线程的终止检测,我们可以通过Thread.joke()方法结束、ThradisAlive()的返回值等手段检测到线程已经终止执行
6.线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断时间的发生,可以通过Thread.interrupted()方法检测到是否有中断发生
7. 对象终结规则:一个对象的初始化完成(构造函数执行结束)先行发生于它的finalize()方法的开始
8. 传递性:如果操作A先行发生于操作B,操作B先行发生于操作C,那就可以得出操作A先行发生于操作C的结论
6.7 Java线程调度
协同式调度:线程的执行时间由线程本身控制
抢占式调度:线程的执行时间由系统来分配
6.8 状态转换
- 新建
- 运行:可能正在执行 。可能正在等待CPU为它分配执行时间
- 无限期等待:不会被分配CUP执行时间,它们要等待被其他线程显式唤醒
- 限期等待:不会被分配CUP执行时间,它们无须等待被其他线程显式唤醒,一定时间会由系统自动唤醒
- 阻塞:阻塞状态在等待这获取到一个排他锁,这个时间将在另一个线程放弃这个锁的时候发生;等待状态就是在等待一段时间,或者唤醒动作的发生
- 结束:已终止线程的线程状态,线程已经结束执行
- 1、不可变:不可变的对象一定是线程安全的、无论是对象的方法实现还是方法的调用者,都不需要再采取任何的线程安全保障 。例如:把对象中带有状态的变量都声明为final,这样在构造函数结束之后,它就是不可变的 。
- 2、绝对线程安全
- 3、相对线程安全:相对的线程安全就是我们通常意义上所讲的线程安全,它需要保证对这个对象单独的操作是线程安全的,我们在调用的时候不需要做额外的保障措施,但是对于一些特定顺序的连续调用,就可能需要在调用端使用额外的同步手段来保证调用的正确性
- 4、线程兼容:对象本身并不是线程安全的,但是可以通过在调用端正确地使用同步手段来保证对象在并发环境中可以安全使用
- 5、线程对立:是指无论调用端是否采取了同步措施,都无法在多线程环境中并发使用的代码
- 互斥同步:
同步是指在多个线程并发访问共享数据时,保证共享数据在同一个时刻只被一个(或者是一些,使用信号量的时候)线程使用 。而互斥是实现同步的一种手段,临界区、互斥量和信号量都是主要的互斥实现方式 。互斥是因,同步是果:互斥是方法,同步是目的
在Java中,最基本的互斥同步手段就是synchronized关键字,它经过编译之后,会在同步块的前后分别形成monitorenter和monitorexit这两个字节码指令,这两个字节码都需要一个reference类型的参数来指明要锁定和解锁的对象 。如果Java程序中的synchronized明确指定了对象参数,那就是这个对象的reference;如果没有指明,那就根据synchronized修饰的是实例方法还是类方法,去取对应的对象实例或Class对象来作为锁对象 。在执行monitorenter指令时,首先要尝试获取对象的锁 。如果这个对象没有被锁定,或者当前线程已经拥有了那个对象的锁,把锁的计数器加1,对应的在执行monitorexit指令时会将锁计数器减1,当计数器为0时,锁就被释放 。如果获取对象锁失败,哪当前线程就要阻塞等待,直到对象锁被另外一个线程释放为止
Synchronized,ReentrantLock增加了一些高级功能
1. 等待可中断:是指当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他事情,可中断特性对处理执行时间非常长的同步块很有帮助
2. 公平锁:是指多个线程在等待同一个锁时,必须按照申请锁的时间顺序来依次获得锁;非公平锁则不能保证这一点,在锁被释放时,任何一个等待锁的线程都有机会获得锁 。Synchronized中的锁是非公平的,ReentrantLock默认情况下也是非公平的,但可以通过带布尔值的构造函数要求使用公平锁
- 命理解读幸福的婚姻为何出现危机
- 医药制品的批号追踪与保质期管理解决办法
- 命理解惑:求测者妻子太年轻,婚姻如何维持
- 今天和大家说一下我对于淘宝内几个流量入口的理解
- java中的关键字含义 java关键字有什么用
- 角速度定义和公式理解 角速度公式到底是如何定义的
- 不同地位的人,面对同一句爻辞该如何理解?
- Java文件读写的常用技术
- 命理解读人一生要经历的四大关卡!
- 深入分析电子结构 动态电子结构解析
