A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 瑞雪雄起 中级黑马   /  2015-9-19 22:48  /  246 人查看  /  0 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 瑞雪雄起 于 2015-9-19 22:59 编辑

线程调度
线程调度是指系统为线程分配处理器使用权的过程:协同式、抢占式。
协同式:线程的执行时间由线程本身控制,线程把自己的工作执行完了之后,要主动通知系统切换到另一个线上。坏处:线程执行时间不可控制。
抢占式:每个线程将由系统来分配执行时间,线程的切换不由线程本身来决定。Java使用该种调用方式。
线程优先级:在一些平台上(操作系统线程优先级比Java线程优先级少)不同的优先级实际会变得相同;优先级可能会被系统自行改变。
8.线程状态
线程状态:
新建NEW:
运行RUNNABLE:
无限期等待WAITING:等得其他线程显式地唤醒。
没有设置Timeout参数的Object.wait();没有设置Timeout参数的Thread.wait()。
限期等待TIMED_WAITING:在一定时间之后会由系统自动唤醒。
设置Timeout参数的Object.wait();设置Timeout参数的Thread.wait();Thread.sleep()方法。
阻塞BLOCKED:等待获取一个排它锁,等待进入一个同步区域。
结束TERMINATED:
9.线程安全
线程安全:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交换执行,也不需要进行额外的同步,或者调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安全的。
不可变:只要一个不可变的对象被正确地构建出来。使用final关键字修饰的基本数据类型;如果共享数据是一个对象,那就需要保证对象的行为不会对其状态产生任何影响(String类的对象)。方法:把对象中带有状态的变量都申明为final,如Integer类。有:枚举类型、Number的部分子类(AtomicInteger和AtomicLong除外)。
绝对线程安全:
相对线程安全:对这个对象单独的操作是线程安全的。一般意义上的线程安全。
线程兼容:需要通过调用端正确地使用同步手段来保证对象在并发环境中安全地使用。
线程对立:不管调用端是否采取了同步措施,都无法在多线程环境中并发使用的代码。有:System.setIn()、System.setOut()、System.runFinalizersOnExit()
10. 线程安全的实现方法
1.1.互斥同步:同步是指在多个线程并发访问共享数据时,保证共享数据在同一个时刻只被一条线程使用。互斥方式:临界区、互斥量和信号量。
Synchronized关键字:编译后会在同步块前后分别形成monitorenter和monitorexit这两个字节码指令。这两个指令都需要一个引用类型的参数来指明要锁定和解锁的对象。如果没有明确指定对象参数,那就根据synchronized修饰的是实例方法还是类方法,去取对应的对象实例或Class对象来作为锁对象。
在执行monitorenter指令时,首先尝试获取对象的锁,如果没有被锁定或者当前线程已经拥有了该对象的锁,则将锁计数器加1,相应的执行moniterexit时,将锁计数器减1,当计数器为0时,锁就被释放了。如果获取对象锁失败,则当前线程就要阻塞等待。
ReentrantLock相对synchronized的高级功能:
等待可中断:当持有锁的线程长期不释放锁时,正在等待的线程可以选择放弃等待,改为处理其他事情。
公平锁:多个线程在等待同一个锁时,必须按照申请锁的事件顺序来一次获取锁;而非公平锁在被释放时,任何一个等待锁的线程都有机会获得锁。Synchronized中的锁是非公平锁,ReentrantLock默认也是非公平锁。
锁绑定多个条件:一个ReentrantLock对象可以同时绑定多个Condition对象。
1.2. 非阻塞同步:
基于冲突检测的乐观并发策略:先进行操作,如果没有其他线程争用共享数据,那操作就成功了;如果共享数据有争用,产生了冲突,那就再进行其他的补偿措施(一般是不断的尝试,直到成功为止)。
AtomicInteger等原子类中提供了方法实现了CAS指令。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马