当下正是滑雪好时节,富爸准备带着乖宝一起感受冰雪世界的刺激与畅快。但滑雪是一项具有危险性的运动,事先具备安全意识并做好准备非常有必要。富爸为此搜罗了一些注意事项,供大家参考参考。 More …
1. LockSupport类
AQS架构使用LockSupport来实现线程的休眠,时间性休眠,唤醒…
2. AQS架构-所有同步器的基本架构
—– a. 基于AQS架构的同步器基本上只需要实现四个函数
1. tryAcqurie(int) — 线程会调用这个函数来做能否互斥的获取同步器资源的尝试的逻辑
2. tryRelease(int) — 线程会调用这个函数来做能否互斥的释放同步器资源的尝试的逻辑
3. tryAcqurieShared(int) — 线程会调用这个函数来做能否共享的获取同步器资源的尝试的逻辑
4. tryReleaseShared(int) — 线程会调用这个函数来做能否共享的释放同步器资源的尝试的逻辑
More …
ReentrantLock是一个互斥的同步器,其实现了接口Lock,里面的功能函数主要有:
1. lock() — 阻塞模式获取资源
2. lockInterruptibly() — 可中断模式获取资源
3. tryLock() — 尝试获取资源
4. tryLock(time) — 在一段时间内尝试获取资源
5. unlock() — 释放资源
More …
下面的lockInterruptibly()就稍微难理解一些。
先说说线程的打扰机制,每个线程都有一个 打扰 标志。这里分两种情况,
1. 线程在sleep或wait,join, 此时如果别的进程调用此进程的 interrupt()方法,此线程会被唤醒并被要求处理InterruptedException;(thread在做IO操作时也可能有类似行为,见java thread api)
2. 此线程在运行中, 则不会收到提醒。但是 此线程的 “打扰标志”会被设置, 可以通过isInterrupted()查看并 作出处理。 More …
Java 5 引入的 Concurrent 并发库软件包中,提供了 ReentrantLock 可重入同步锁,用来替代 synchronized 关键字原语,并可提供更好的性能,以及更强大的功能。使用方法也很简单: More …
Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象。两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象。
读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。总之,读的时候上读锁,写的时候上写锁! More …
前面的章节主要谈谈原子操作,至于与原子操作一些相关的问题或者说陷阱就放到最后的总结篇来整体说明。从这一章开始花少量的篇幅谈谈锁机制。
上一个章节中谈到了锁机制,并且针对于原子操作谈了一些相关的概念和设计思想。接下来的文章中,尽可能的深入研究锁机制,并且理解里面的原理和实际应用场合。
尽管synchronized在语法上已经足够简单了,在JDK 5之前只能借助此实现,但是由于是独占锁,性能却不高,因此JDK 5以后就开始借助于JNI来完成更高级的锁实现。 More …
重入锁(ReentrantLock)是一种递归无阻塞的同步机制。以前一直认为它是synchronized的简单替代,而且实现机制也不相差太远。不过最近实践过程中发现它们之间还是有着天壤之别。 More …
主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。 More …