线程
一杯就醉1929
这个作者很懒,什么都没留下…
展开
-
Synchronized 和volatile
一、同步关键字Synchronized 使用方式有两种: 修饰方法,即对某一个方法进行同步。 普通方法,调用这个方法的对象进行加锁。 静态方法:是对这个类进行加锁。 修饰代码块,即只对一部分代码进行同步。 括号中的变量也分为普通变量和静态变量两种。 普通变量和普通方法线程是获取对象的锁。原创 2016-10-09 23:32:52 · 310 阅读 · 0 评论 -
SynchronousQueue的实现 TransferQueue (一)
先看下 TransferQueue下面介绍它的几个方法: transfer(E e)若当前存在一个正在等待获取数据的消费者线程,该消费者线程,会立刻得到这个数据。否则,将e插入到队列的尾部,并且当前线程进入阻塞状态。即在没有消费者的情况下,生成者也无法进行生产。tryTransfer (E e)若当前存在一个正在等待获取的消费者线程,则该方法会即刻转移e,并返回true,若不存在则返回false。原创 2017-07-04 21:28:23 · 542 阅读 · 0 评论 -
SynchronousQueue 实现 二
SynchronousQueue也是一种阻塞队列,同时也是同步队列。每一个put操作必须等待一个take操作;每一个take操作必须等待一个put操作。 没有任何内部容量。不允许是null元素。内部实现使用了Transferer。竞争机制支持公平和非公平两种: 非公平竞争模式使用的数据结构是后进先出的栈(TransferStack);公平竞争模式使用先进先出的队列(TransferQueue)。S原创 2017-07-04 22:39:21 · 244 阅读 · 0 评论 -
锁优化的建议
1、减小锁持有时间它的核心思想就是不要在不必需要的代码上加锁,因为线程持有的锁时间过长,相对地,锁的竞争程度也就越激烈。看下面的代码:public synchronized void syncMethod() { othercode1(); mutextMethod(); othercode2(); } public void syncM原创 2017-07-05 19:57:20 · 291 阅读 · 0 评论 -
Java并发编程 希尔排序
1、插入排序插入排序是一种很常用的排序算法。它的基本思想是:一个未排序的数据分成两部分,前半部是已经排序的,后半部分是未排序的。在进行排序时,只需要在未排序的部分中选择一个元素,将其插入到前面有序的数组中即可。最终未排序的部分会越来越少,直到为0,那么排序就完成了。平均时间复杂度 O(n2) 最好情况是 O(n) 最差时间是O(n2)原创 2017-06-26 23:15:48 · 644 阅读 · 0 评论 -
java虚拟机对锁优化所做的努力
1、 锁偏向锁偏向是一种针对加锁操作的优化手段。如果一个线程获得了锁,那么锁就进入偏向模式。当这个线程再次请求锁时,无须再做任何同步操作。这样就节省了大量有关锁申请的操作,从而提高了程序性能。因此,对于几乎没有锁竞争的场合,偏向锁有比较红啊的优化效果,因为连续多次极有可能是同一个线程请求相同的锁。而对于锁竞争比较激烈的场合,其效果不佳。因为在竞争激烈的场合,最有可能的情况是每次都是不同的线程来请求相原创 2017-07-05 20:45:28 · 387 阅读 · 0 评论 -
Java 并发ThreadLocal
从ThreadLocal 的名字上可以看到,这是一个线程的局部变量。也就是说,只有当前线程可以访问。既然是只有当前线程可以访问的数据,自然是线程安全的。实际上,ThreadLocal确实也是Thread的一个属性:原创 2017-07-05 21:38:14 · 359 阅读 · 0 评论 -
ConcurrentSkipListMap
在JDK的并发包中,除了常用的哈希表外,还有一种数据结构–跳表。跳表是一种可以用来快速查找的数据结构,有点类似与平衡树。它们都可以对元素进行快速查找。就查询性能而言,跳表的时间复杂度是O(log n)跳表的结构图如下:最底层呢的链表维护了跳表内的所有的元素,每上面一层链表都是下面一层的子集,一个元素插入哪些层是完全随机的。 跳表里面的数据是有序的。原创 2017-07-06 21:36:46 · 283 阅读 · 0 评论 -
Java 并发编程 锁与同步器
1、lockLock 接口是Java并发包中最基础的一个接口,相应的它定义了一些锁的基本功能。相比synchronized关键字,具有以下特征: 可以尝试非阻塞地获取锁 可中断的获取锁 定时获取锁原创 2017-07-17 21:40:07 · 620 阅读 · 0 评论 -
Java 并发编程 四 协作
ReadWriteLock读写锁概念很好理解,下面是代码:package com.test.thread3;import java.util.Random;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;import java.util.concurrent.locks原创 2017-06-25 17:14:09 · 313 阅读 · 0 评论 -
Java 并发编程 同步控制 三
1、 重入锁 ReentrantLock synchronized 的重入锁: ReentrantLock。 重入锁需要手动进行加锁和解锁: lock 和unlock。public class ReentrantLockTest implements Runnable{ public static ReentrantLock lock = new ReentrantLock();原创 2017-06-25 15:17:09 · 272 阅读 · 0 评论 -
JDK中的线程池 :工作队列和拒绝策略 上
JDK 可以创建使用Executors 创建5种类型的线程池 Executors.newCachedThreadPool();该方法返回一个可根据实际情况调整线程数量的线程池。线程池的线程数量不确定,但若有空闲线程可以复用,则会优先 使用可复用的线程。 若所有线程均工作,又有新的任务提交,则会创建新的线程处理任务。所有线程在当前安任务执行完毕后,将返回线程池进行复用。原创 2017-06-29 22:45:56 · 2449 阅读 · 0 评论 -
ScheduledExecutorService 中两个方法
这个是用来执行计划任务的。原创 2017-06-29 23:09:56 · 435 阅读 · 0 评论 -
Java自定义拒绝策略与线程池
1、拒绝策略ThreadPoolExcetor 的最后一个参数指定了拒绝策略,JDK提供了四种拒绝策略: AbortPolicy 策略、CallerRunsPolicy策略、 DiscardOledestPolicy策略、DiscardPolicy策略。原创 2017-07-01 12:25:42 · 5161 阅读 · 0 评论 -
Java 并发编程 Fork Join 一
“分而治之”一直是一个非常有效地处理大量数据的方法。著名的MapReduce也是采取了分而治之的思想。 Fork就是分解任务,而Join 在Java线程中是等待意思 ,也就是等待计算结果。在实际应用中如果毫无顾忌地使用fork开启线程进行处理,那么很多可能会导致系统开启过多的线程而严重影响性能。原创 2017-07-02 19:15:24 · 241 阅读 · 0 评论 -
CountdownLatch 模拟 玩家就位
以下是代码 CountdownLatch是一个同步工具类,它可以使得等待几个线程一起执行完毕后,再开始执行后面的程序。原创 2017-07-12 23:04:07 · 238 阅读 · 0 评论 -
Java 并发编程 CAS
1、比较交换 CAS与锁相比,使用比较交换会使程序看起来更加复杂一些。但由于其非阻塞性,他对死锁问题天生免疫,并且,线程间的相互影响也远远比基于锁的方式要小。使用无锁的方式完全没有锁竞争带来的系统开销,也没有线程间频繁调度带来的开销。原创 2017-07-03 21:53:19 · 301 阅读 · 0 评论 -
Java并发 基础 二
1 、线程中断:线程中断是一种重要的线程协作机制。线程中断并不会让线程退出,只是给线程发送一个通知,线程执行过程会检测到这个通知,然后可以自定义做出动作,比如退出,但也并不是都是退出。原创 2017-06-24 23:16:24 · 246 阅读 · 0 评论 -
Java 并发编程 基础 一
1、同步 和 异步同步 和 异步描述方法的调用。 同步:方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。 串行的进行方法的调用。 异步方法调用更像一个消息传递,一旦方法调用就会立即返回。2、并发和并行并发:多个任务交替执行。 并行:多个CPU的系统上,多个CPU同时执行任务。3、临界区:用来表示公共资源或者公共数据。可以被多个线程同时使用,但是每一次,只能有一个线程使用它。原创 2017-06-24 23:22:25 · 257 阅读 · 0 评论 -
Java 并发 CountLatchDown
一个同步工具,使得当前线程等待,直到其他多个线程完成一系列的操作后,继续执行。 其中的当前线程也可以是多个线程,这个地方的线程的数量是任意的。也就是await() 可以在多个线程中调用。 这个方法可以使得当前线程等待,也就是当前线程在未获得同步状态时,进入等待状态。因此这个这个也是获取同步状态的方法。这个方法获取同步状态,是以共享式的获取同步状态,因此await() 可以在多个线程中调用。原创 2017-07-19 22:45:45 · 1315 阅读 · 2 评论