![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
线程
Terisadeng
工作繁忙,私信和评论提的问题可能没时间复现解答(。・_・。)ノI’m sorry~
展开
-
使用wait()和notify()方法实现生产者消费者模式
以下总结只是个人理解,如有错误,敬请指正。一、wait()和notify()作用wait()和notify()方法是Object类的方法,因为Object类是所有类的根类,因此所有类都有这两个方法。当调用对象的wait()方法时会释放获取的该对象的锁。既然是释放锁,我们首先要有锁才能释放,因此wait()方法必须在同步方法或同步代码块中才能执行即在synchronized修饰的方法...原创 2019-01-25 16:40:48 · 3657 阅读 · 0 评论 -
ReentrantLock可中断锁
ReentrantLock中的lockInterruptibly()方法使得线程可以在被阻塞时响应中断,比如一个线程t1通过lockInterruptibly()方法获取到一个可重入锁,并执行一个长时间的任务,另一个线程通过interrupt()方法就可以立刻打断t1线程的执行,来获取t1持有的那个可重入锁。而通过ReentrantLock的lock()方法或者Synchronized持有锁的线程...原创 2019-07-01 16:16:27 · 11066 阅读 · 11 评论 -
Volatile作用
在多线程环境下,对于主内存中的共享变量,每个线程都有自己的一份拷贝值,便于自己线程内的操作,这也会导致一个问题,当有一个线程修改主内存中的变量值时,其他线程内拷贝的变量值还是旧值,没有获取最新的值。因此我们就可以使用volatile关键字修饰变量,它可以保证内存可见性和避免指令重排序。当有线程修改主内存中的变量值时,会导致其他线程中拷贝的变量值失效,当线程内读取自己线程内存中的变量值时会发现变量值...原创 2019-03-29 11:35:32 · 139 阅读 · 0 评论 -
多线程脏读示例
import java.util.concurrent.TimeUnit;/** * 脏读 * @author SN * */public class DirtyRead { private String username="aa"; private String hobby="music"; //下面是同步方法,可以保证更新的原子性 public synchroniz...原创 2019-03-28 10:57:41 · 369 阅读 · 0 评论 -
DelayQueue用例
DelayQueue是一个延迟队列,插入队列的数据只有达到设置的延迟时间时才能被取出,否则线程会被阻塞。插入队列的对象必须实现Delayed接口,实现comapreTo方法和getDelay方法,其中getDelay方法用于设置对象延迟多少秒取出,compareTo用于对被延迟取出的数据进行排序,所以compareTo方法中一般调用对象的getDelay方法,根据对象的延迟时间进行排序。首先是...原创 2019-03-30 22:45:25 · 214 阅读 · 0 评论 -
PriorityBlockingQueue用例
PriorityBlockingQueue顾名思义是带有优先级的阻塞队列,为了实现按优先级弹出数据,存入其中的对象必须实现comparable接口自定义排序方法。取出数据时会按照compareTo方法排序后的顺序取出。首先是定义实现comparable接口的类:/** * 添加到优先级队列的对象需要自定义排序方法 * @author SN * */public class Pr...原创 2019-03-30 17:10:13 · 248 阅读 · 0 评论 -
SynchronousQueue用例
SynchronousQueue是无缓冲区的阻塞队列,即不能直接向队列中添加数据,会报队列满异常,如下所示:import java.util.concurrent.SynchronousQueue;public class SynchronousQueueExp { public static void main(String[] args) { SynchronousQueu...原创 2019-03-30 16:34:30 · 259 阅读 · 0 评论