多线程/并发
joenqc
这个作者很懒,什么都没留下…
展开
-
关于一个可见性和指令重排序的例子
java cocurrency in practicepublic class NoVisibility { private static boolean ready; private static int number; private static class ReaderThread extends Thread{ public void run(){原创 2017-02-08 13:18:48 · 1611 阅读 · 0 评论 -
Semaphore的简单理解
Semaphore的概念Semaphore是一个计数器信号量,它维护了一个许可集合,用来控制对一定资源的消费与回收。当线程调用acquire()方法时,如果许可不足,那么线程将block,直到有许可可用。release()方法则会释放一个许可。Semaphore的用法Semaphore提供了两个构造方法:public Semaphore(int permits) { //参数per转载 2017-08-10 11:30:32 · 397 阅读 · 0 评论 -
深入理解Java之线程池
原文:http://www.importnew.com/19011.html在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并转载 2017-08-05 14:58:24 · 295 阅读 · 0 评论 -
Unsafe与CAS
原文 :http://www.cnblogs.com/xrq730/p/4976007.htmlUnsafe与CASUnsafe简单讲一下这个类。Java无法直接访问底层操作系统,而是通过本地(native)方法来访问。不过尽管如此,JVM还是开了一个后门,JDK中有一个类Unsafe,它提供了硬件级别的原子操作。这个类尽管里面的方法都是public的,但是转载 2017-06-05 14:32:23 · 335 阅读 · 0 评论 -
关于java中的join()方法
javadoc是这样写的public final void join() throws InterruptedExceptionWaits for this thread to die. An invocation of this method behaves in exactly the same way as the invocation join(0) Th原创 2017-02-11 16:59:10 · 613 阅读 · 0 评论 -
超清晰的java线程状态机图
http://www.uml-diagrams.org/examples/java-6-thread-state-machine-diagram-example.html原创 2017-09-10 19:28:54 · 3891 阅读 · 0 评论 -
Timer类jdk文档翻译及源码分析
Timer是进行任务调度的工具类,用来执行任务。Task可以被执行一次,也可以按照一个固定的时间间隔重复执行。每个定时器对象都维护一个single后台线程,它用于顺序执行该定时器对象的所有任务。因此提交给Timer对象的任务应当能够快速执行完。如果一个任务耗时太长,有可能导致后续任务延迟执行,或者导致很多个后续任务积压,并且快速的串行执行完成。当对Timer对象的最后一个引用消失,并且所有未完成的任原创 2017-07-29 20:49:14 · 384 阅读 · 0 评论 -
闲聊Mysql的锁与事务和java中的锁机制
主要参考文章:https://tech.meituan.com/innodb-lock.htmlhttp://blog.csdn.net/soonfly/article/details/70238902这篇文章主要侧重Innodb引擎~Innodb引擎为了保证事务的一致性、隔离性以及数据在并发读-读、读-写、写-写的情况下的正确性,用到的技术有:悲观锁(表锁、行锁、GAP间隙锁)、MVCC(快照读、原创 2017-07-15 21:28:42 · 6200 阅读 · 0 评论 -
简明扼要阐述synchronized和lock的区别
简明扼要阐述synchronized和lock的区别原创 2017-09-04 22:28:41 · 1942 阅读 · 0 评论 -
CyclicBarrier的简单理解
CyclicBarrier的概念字面翻译为回环栅栏,同CountDownLatch一样,也是concurrent包中提供的多线程之间通信的一种方式。它允许一组线程在等待某个状态后再全部同时执行。它允许一组线程互相等待对方,直到到达一个公共障碍点(barrier point)。它的一个典型应用是一组固定个数的线程需要互相等待,直到全部执行完成后,再继续执行。之所以称为Cyclic,是因为所有等待线程被原创 2017-08-10 11:11:26 · 595 阅读 · 0 评论 -
CountDownLatch的简单理解
CountDownLatch的概念CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成了任务,然后原创 2017-08-10 10:41:49 · 41685 阅读 · 0 评论 -
关于java的中断机制(interrupt)
参考资料: http://www.infoq.com/cn/articles/java-interrupt-mechanism Java编程并发实战当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务。Java没有提供一种安全直接的方法来停止某个线程,但是Java提供了中断机制。一、中原创 2017-02-11 15:17:45 · 2444 阅读 · 0 评论 -
java中等待通知机制(wait/notify)
等待/通知的相关方法 方法名称 描述 notify() 通知一个在对象上等待的线程,由WAITING状态变为BLOCKING状态,从等待队列移动到同步队列,等待CPU调度获取该对象的锁,当该线程获取到了对象的锁后,该线程从wait()方法返回 notifyAll() 通知所有等待在该对象上的线程,由WAITING状态变为BLOCKING状态,等待CPU调度获取该对象的锁 w原创 2017-02-11 11:24:00 · 4189 阅读 · 0 评论 -
通俗易懂讲解happens-before原则
文章原地址:http://blog.csdn.net/u010031673/article/details/48153797 在接下来的叙述里我首先会说明happens-before规则是干什么用的,然后用一个简单的小程序说明happens-before规则一、happens-before规则我们编写的程序都要经过优化后(编译器和处理器会对我们的程序进行优化以提高运行效转载 2017-02-12 11:51:40 · 285 阅读 · 0 评论 -
线程安全的延迟初始化方式
在java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。因此需要引入延迟初始化技术。在单线程中延迟初始化对象的代码,在多线程中是非线程安全的,因为此时会出现竞态条件(Race Condition),典型的先判断后执行。有可能出现的问题:两个线程同时进入代码2,可能两个线程返回了两个不同的instance实例引用,如果两个线程后续还会对instance实原创 2017-02-11 19:39:43 · 934 阅读 · 0 评论 -
jedisLock—redis分布式锁实现
jedisLock—redis分布式锁实现一、使用分布式锁要满足的几个条件:系统是一个分布式系统(关键是分布式,单机的可以使用ReentrantLock或者synchronized代码块来实现)共享资源(各个系统访问同一个资源,资源的载体可能是传统关系型数据库或者NoSQL)同步访问(即有很多个进程同事访问同一个共享资源。没有同步访问,谁管你资源竞争不竞争)二、应用转载 2017-06-15 15:17:18 · 350 阅读 · 0 评论 -
Callable和Future
原文: http://blog.csdn.net/ghsau/article/details/7451464接着上一篇继续并发包的学习,本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果。 Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功转载 2017-07-29 15:48:30 · 325 阅读 · 0 评论 -
java中按顺序执行两个线程的方法
比如有线程A和B,在A执行完成后B再开始执行在线程A run方法最后启动线程B - -共享一个volatile boolean类型的标识变量,B一直检查该变量的值,而A则在执行完成后改变A的值使用中断机制,和上面的方式差不多,B一直检查Thread.currentThread().isInterrupted() ,而A则在执行完成过后中断B threadB.interrupt()使用Obje原创 2017-02-11 16:37:22 · 3250 阅读 · 0 评论 -
java中阻塞队列BlockingQueue的用法
原文:http://blog.itpub.net/143526/viewspace-1060365/在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。转载 2017-07-18 16:56:46 · 276 阅读 · 0 评论 -
偏向锁、轻量级锁、重量级锁之间的变迁
对象锁共有四种状态:无锁、偏向锁、轻量级锁、重量级锁,锁竞争程度依次加重。对象锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。自旋是一种获取锁的策略,存在于获取轻量级锁的过程中,不是一种锁,java的对象锁只有上述四种。假设现在有一个对象O,刚刚被新建,处于无锁状态。此时线程A尝试获取对象锁,如果此时jvm已经开启了偏向锁,那么线程A会尝试CAS操作将自己的线程Id...原创 2018-02-27 11:55:16 · 920 阅读 · 0 评论