java线程学习(3)

同步策略定义了对象如何协调对其状态的访问,并且不违反其不变约束和后验条件

不变约束保证状态是合法的,后验调整保证状态的变化是合法的

通过实例限制(将非线程安全的对象限制在其期望范围内并保证不会逸出)可以实现对非线程安全对象的线程安全使用

如果一个类由多个彼此独立的线程安全的状态变量组成,并且类的操作不包含无效状态转化(即状态转化后的状态不会违反约束条件),那么可以将线程安全委托给这些状态变量

委托是创建线程安全类最有效的策略之一,用已有的线程安全类来管理所有的状态。

同步容器类分为两部分,一部分是vector和hashtable,另一部分是wrapper类

当线程并发修改容器时,会发生并发问题(使用客户端加锁,即明白要使用哪一哥锁,并且用该锁对容器修改进行原子操作)

concurrentModificationexception:在进入循环之后,发现容器被修改,抛出该异常,或者单线程下直接删除容器中对象,而不是remove()删除,会抛出该异常

在迭代期间,对容器加锁的一个替代方法是复制容器,因为复制是线程限制的

字符串的拼接是经过编译转化为stringbuilder.append()来完成的,最后通过tostring来转回字符串,而tostring是一个迭代的过程

concurrenthashmap代替同步的hashmap实现

1:mao.get(),map.contains()等操作遍历整个容器,调用大量的equals方法,当hacode没有很好的分配hash值时,在最极端的情况下,会把hash表转化为线性链表,遍历线性链表的其中一部分或者全部会花费大量的时间,而这过程中,其他线程无法访问。concurrenthashmap使用分离锁解决了该问题

2:不会抛出concurrentModificationexception,concurrenthashmap会保证即使感应到其他线程对容器的修改

3:map是独占的

copyonwritearraylist代替同步的list实现

1:“写入时复制“容器来自于这样的一个事实:只要有效的不可变对象被正确发布,那么访问他将不再需要更多的同步,在每次需要修改时,他们会创建并发布一个新的容器拷贝,以此来实现可变性,“写入时复制“容器的迭代器保留一个底层数组的引用,该引用永远不会被修改,因此对他的同步是保证了可见性。同时也说明了该迭代器不会出现

concurrentModificationexception,由于修改时复制容器需要一定的开销,所以当迭代频率远大于容器修改频率时候,使用该容器才有意义
阻塞队列(blocking queue)
1:队列可以是有限的,也可以是无限的,当队列满时,put被阻塞,当队列空时,take被阻塞,阻塞队列支持生产者消费者模式
2:put和take方法会抛出一个受检查的interruptedexception,这说明该方法是可阻塞的,也说明当中断时,能提前结束阻塞,当抛出interruptedexception,你可以选择传递异常或者通过调用interrupt修复终端。
deque(双端队列)
1:窃取工作:在窃取工作中,每一个消费者都是一个双端队列,当自己的任务完成时,可以窃取其他消费者的末尾任务

阻塞的情况有:等待IO操作,等待锁,等待从睡眠中唤醒,等待另一个线程结束,当线程阻塞时,其状态会被设置成BLOCKING,WAITING,TIME_WAITING

thread提供了interrupt属性,该属性为boolean变量,用来代表线程的终端状态,但是中断是一种协作机制,一个线程不能迫使另一个线程停止他正在做的事情

sychronizer是一个对象,它根据本身的状态来调节线程的控制流,其类型包括阻塞队列,闭锁,关卡,信号量,sychronizer的特点是:他们封装状态,而这些状态决定着线程到某一个点是通过还是阻塞。

闭锁

1:闭锁可以用来确保特定活动直到其他活动完成后发生

2:countdownlatch是一个闭锁实现,允许一个或多哥线程等待事件集发生,闭锁的状态包含一个计数器,初始值为整数,代表要发生的事件数,countdown方法对计数器做减法操作,表示一个事件已经发生,await方法等待计数器到达0,表示所有事件已经发生完毕,await会一直阻塞,除非计数器为0,或者中断,超时

3futuretask也是一个闭锁的实现,它描述了抽象的可带结果的计算,它的计算是由cllable实现的,相当于一个带计算结果的runnable,他有三种状态,等待,运行,完成,完成包括正常结束,取消,异常,一旦完成,永远停留在完成状态

3:future.get的行为依赖于任务的状态,如果它完成了,get直接返回结果,否则会阻塞直到任务转入完成状态,然后返回结果或者抛出异常

计数信号量,用来控制能够同时访问某特定资源的活动的数量,或是同时执行某一操作的数量,信号量可以给某一池或者容器限定边界

1:semaphore管理一个可许集,活动能够通过acquire获取可许集,并在活动结束时通过release释放给semaphore,如果可许集为空,则acquire阻塞(被中断或者超时)

关卡:阻止一组线程,直到某些事件发生, 与闭锁不同,闭锁等待的是事件,而关卡等待的是线程


有一个实力未上= =

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值