摘要:CountDownLatch,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后, 计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务, 然后在闭锁上等待的线程就可以恢复执行任务。 应用场景:多个线程同时工作,然后其中几个可以随意并发执行,但有一个线程需要等其他线程工作结
阅读全文
摘要:Semaphore叫做信号量 可以控制某个资源可被同时访问的个数, acquire() 获取一个许可,得到许可才能执行后面的代码,如果没有就等待。 release() 释放一个许可。 当信号量的只允许一个线程访问时,就变成了锁的功能。 下面代码演示 执行结果如下 每一秒钟只能允许一个线程执行。
阅读全文
摘要:ReentrantLock类是可重入、互斥、实现了Lock接口的锁,它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力。ReenreantLock类的常用方法有: ReentrantLock() : 创建一个ReentrantLock实例 ReentrantLock(
阅读全文
摘要:先看一个例子,AtomicInteger 实现的线程安全的累加器 AtomicInteger源码分析 下面通过AtomicInteger的源码来看一下是怎么在没有锁的情况下保证数据正确性。首先看一下incrementAndGet方法的实现 注意::valueOffset叫做 偏移量 我们知道valu
阅读全文
摘要:wait()/ notify()/ notifyAll() 任何Object对象都可以作为这三个方法的主调,但是不推荐线程对象调用这些方法。 1使用wait()、notify()和notifyAll()时需要首先对调用对象加锁【必须使用在同步代码块】2调用wait()方法后,线程状态会从RUNNIN
阅读全文
摘要:先来看一个线程安全的例子 ,两个线程对count进行累加,共累加10万次。 随便运行多少次这个程序,都得不到正确的结果 200000 于是乎 引出今天的问题,线程安全问题。 怎么解决呢,有多种解决方法,现在来说2种, 第一种 在 Add 类的 run方法上 加synchronized 第二种 使用无
阅读全文
摘要:守护线程 执行一些非业务方法,比如gc。当全部都是守护线程的时候,jvm退出 线程优先级 设置线程优先级:setPriority(int priorityLevel)。参数priorityLevel范围在1-10之间,值越大优先级越高, 能被执行到的概率越大,但非优先执行。 sleep() 让当前的
阅读全文
摘要:我们知道线程线程有三种创建方式 1实现Runnable接口 2 继承Thread类 3使用Callable和Future接口创建线程。具体是创建Callable接口的实现类,并实现clall()方法。并使用FutureTask类来包装Callable实现类的对象,且以此FutureTask对象作为T
阅读全文