![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Thread
文章平均质量分 88
_从头再来_
不积跬步无以至千里
展开
-
Java单例模式中双重检查锁的问题
单例创建模式是一个通用的编程习语。和多线程一起使用时,必需使用某种类型的同步。在努力创建更有效的代码时,Java 程序员们创建了双重检查锁定习语,将其和单例创建模式一起使用,从而限制同步代码量。然而,由于一些不太常见的 Java 内存模型细节的原因,并不能保证这个双重检查锁定习语有效。它偶尔会失败,而不是总失败。此外,它失败的原因并不明显,还包含 Java 内存模型的一些隐秘细节。这些转载 2018-01-17 14:56:36 · 324 阅读 · 0 评论 -
Java多线程中start()和run()的区别
Java的线程是通过java.lang.Thread类来实现的。VM启动时会有一个由主方法所定义的线程。可以通过创建Thread的实例来创建新的线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。在Java当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡:原创 2018-01-15 22:50:37 · 6026 阅读 · 0 评论 -
notify和notifyAll的一段代码分析
当你Google”notify()和notifyAll()的区别”时,会有大片的结果弹出来,(这里先把jdk的javadoc文档那一段撇开不说),所有这些搜索结果归结为等待的线程被唤醒的数量:notify()是唤醒一个, 而notifyall()是唤醒全部.那他们的真正区别是什么呢?让我们来看看个生产者/消费者的案例(假设生产者/消费者这个类中有两个方法put和get),它是有问题的(因为这里转载 2018-01-16 10:25:41 · 172 阅读 · 0 评论 -
interrupt、interrupted和isInterrupted的区别
今天在看到Thread类的isInterrupted方法可以获取线程的中断状态:于是写了个例子想验证一下:[java] view plain copypublic class Interrupt { public static void main(String[] args) throws Excepti转载 2018-01-15 13:59:12 · 185 阅读 · 0 评论 -
java 多线程并发系列之 生产者消费者模式的两种实现
生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。真实世界中的生产者消费者模式生产者和消费者模式在生活当中随处可见,它描述的是协调与协作的关系。比如一个人正在准备食物(生产者),而另一个人正在吃(消费者),他们使用一个共用的桌子用于放置盘子和取走盘子,生产者准备食物,如转载 2018-01-15 22:47:46 · 221 阅读 · 0 评论 -
Thread的中断机制(interrupt)
中断线程线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。线程会不时地检测这个中断标示位,以判断线程是否应该被中断(中断标示值是否为true)。它并不像stop方法那样会中断一个正在运行的线程。判断线程是否被中断判断某个线程是否已被发送过中转载 2018-01-15 14:12:27 · 204 阅读 · 0 评论 -
线程池实现
A thread is an independent program’s path of execution. In java, each thread extends the java.lang.Thread class or implements java.lang.Runnable.Multithreading refers to the execution of two or mo原创 2018-02-27 11:04:45 · 208 阅读 · 0 评论 -
ThreadLocal用法详解和原理
一、用法ThreadLocal用于保存某个线程共享变量:对于同一个static ThreadLocal,不同线程只能从中get,set,remove自己的变量,而不会影响其他线程的变量。1、ThreadLocal.get: 获取ThreadLocal中当前线程共享变量的值。2、ThreadLocal.set: 设置ThreadLocal中当前线程共享变量的值。3、ThreadLoc转载 2018-03-02 09:44:21 · 142 阅读 · 0 评论 -
条件锁
ReentrantLock类有一个方法newCondition用来生成这个锁对象的一个条件(ConditionObject)对象,它实现了Condition接口。Condition提供了线程通讯的一套机制await和signal等线程间进行通讯的方法。。1、适用场景 当某线程获取了锁对象,但因为某些条件没有满足,需要在这个条件上等待,直到条件满足才能够往下继续执行时,就需要用到条件锁。 ...转载 2018-03-12 13:43:31 · 796 阅读 · 0 评论 -
Java线程相关50题
不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发、调试、优化经验,所以线程相关的问题在面试中经常会被提到。在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用转载 2018-01-17 14:16:54 · 236 阅读 · 0 评论 -
关于Java并发编程的总结和思考
编写优质的并发代码是一件难度极高的事情。Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的,但是当我们对并发编程有了更深刻的认识和更多的实践后,实现并发编程就有了更多的方案和更好的选择。本文是对并发编程的一点总结和思考,同时也分享了Java 5以后的版本中如何编写并发代码的一点点经验。为什么需要并发 并发其实是一种解耦合的策略,它帮助我们把做什么(目标)和什么时候做(时机转载 2018-01-19 16:08:56 · 129 阅读 · 0 评论 -
Session 共享
http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你。那么,在一些场合,确实需要服务器记住当前用户怎么办?比如用户登录邮箱后,接下来要收邮件、写邮件,总不能每次操作都让用户输入用户名和密码吧,为了解决这个问题,session的方案就被提了出来,事实上它并不是什么新技术,而且也不能脱离http协议以及任何现有的web技术。原理很简转载 2018-01-25 14:08:46 · 229 阅读 · 0 评论 -
java并发编程CountDownLatch使用
有时候会有这样的需求,多个线程同时工作,然后其中几个可以随意并发执行,但有一个线程需要等其他线程工作结束后,才能开始。举个例子,开启多个线程分块下载一个大文件,每个线程只下载固定的一截,最后由另外一个线程来拼接所有的分段,那么这时候我们可以考虑使用CountDownLatch来控制并发。 CountDownLatch是JAVA提供在java.util.concurrent包下的一个辅原创 2018-01-19 10:37:26 · 676 阅读 · 0 评论 -
java volatile的适用场景
把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有 原子性(atomicity)和 可见性(visibility)。原子性意味着个时刻,只有一个线程能够执行一段代码,这段代码通过一个monitor object保护。从而防止多个线程在更新共享状态时相互冲突。可见性则更为微妙,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的。 —— 如果转载 2018-01-19 15:58:35 · 600 阅读 · 0 评论 -
Java并发编程中Exchanger的用法
Exchanger类源于java.util.concurrent包,它可以在两个线程之间传输数据,Exchanger中的public V exchange(V x)方法被调用后等待另一个线程到达交换点(如果当前线程没有被中断),然后将已知的对象传给它,返回接收的对象。如果另外一个线程已经在交换点等待,那么恢复线程计划并接收通过当前线程传给的对象:public class Car ext转载 2018-01-18 21:49:11 · 217 阅读 · 0 评论 -
Java并发包中CyclicBarrier的工作原理、使用示例
1. CyclicBarrier的介绍与源码分析CyclicBarrier 的字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。线程进入屏障通过CyclicBarrier的await()方法。CyclicBarrier默认的构造方转载 2018-01-18 21:44:35 · 226 阅读 · 0 评论 -
Java之Semaphore
一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。拿到信号量的线程可以进入代码,否则就等待。通过acquire()和release()获取和释放访问许可转载 2018-01-18 21:26:46 · 159 阅读 · 0 评论 -
JDK7中TransferQueue的使用以及TransferQueue与SynchronousQueue的差别
JDK7对JDK5中的J.U.C并发工具进行了增强,其中之一就是新增了TransferQueue。public interface TransferQueue extends BlockingQueue从类的源码可以看到TransferQueue同时也是一个阻塞队列,它具备阻塞队列的所有特性,主要介绍下上面5个新增API的作用。1.transfer(E e)若当前存在一个正原创 2018-01-18 17:10:39 · 1460 阅读 · 0 评论 -
ReentrantReadWriteLock读写锁的使用
对象的方法中一旦加入synchronized修饰,则任何时刻只能有一个线程访问synchronized修饰的方法。假设有个数据对象拥有写方法与读方法,多线程环境中要想保证数据的安全,需对该对象的读写方法都要加入 synchronized同步块。这样任何线程在写入时,其它线程无法读取与改变数据;如果有线程在读取时,其他线程也无法读取或写入。这种方式在写入操作远大于读操作时,问题不大,而当读取远远大于转载 2018-01-18 11:25:53 · 161 阅读 · 0 评论 -
java 利用Future异步获取多线程任务结果
Future接口是Java标准API的一部分,在java.util.concurrent包中。Future接口是Java线程Future模式的实现,可以来进行异步计算。有了Future就可以进行三段式的编程了,1.启动多线程任务2.处理其他事3.收集多线程任务结果。从而实现了非阻塞的任务调用。在途中遇到一个问题,那就是虽然能异步获取结果,但是Future的结果需要通过isdone来判断是否有结...转载 2018-11-25 20:15:07 · 1041 阅读 · 0 评论