
多线程
张一柯
这个作者很懒,什么都没留下…
展开
-
Semaphore类
1.简介 信号量通过一组许可证来控制对共享资源的访问。 如果需要,可以用acquire()方法获取许可,如果许可为0,那么会进行阻塞,通过使用release()方法释放许可,把许可归还给Semaphore,归还之后,阻塞的线程优惠醒来尝试获取许可。 2.api简介 Semaphore(int permits):非公平模式创建; Semaphore(int permits, boolean fair):可以指定是否公平模式创建; acquire():尝试获取1个许可,如果没有许可则阻塞,可以被中断停止等待;原创 2020-06-03 14:49:43 · 561 阅读 · 0 评论 -
CyclicBarrier类
1.简介 可循环利用的屏障。 它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。 作用:会让所有线程都等待完成后才会继续下一步行动。 2.使用场景 需要所有的子任务都完成时,才执行主任务,这个时候就可以选择使用CyclicBarrier。 3.主要方法 public int a原创 2020-06-03 14:18:07 · 273 阅读 · 0 评论 -
类CountDownLatch的使用
1.简介 允许一个或多个线程等待,直到在其他线程中执行的一组操作完成为止。 一个CountDownLatch初始化为给定数。该await方法将阻塞,直到由于该countDown()方法的调用导致当前计数达到零为止,此后所有等待线程都被释放,并且随后的任何awaitreturn 调用都将立即释放 。这是一种一次性现象-无法重置计数。如果您需要用于重置计数的版本,请考虑使用CyclicBarrier。 2.例子 //线程类 public class GetDataStatusThread extends Thr原创 2020-06-03 11:09:22 · 237 阅读 · 0 评论 -
ConcurrentHashMap源码分析(一)
因为jdk版本的不同,jdk1.8版本中的ConcurrentHashMap与jdk1.6、jdk1.7版本的实现大有不同,所以本篇文章主要对比HashTable和HashMap对jdk1.6、1.7版本的ConcurrentHashMap做一个详细的总结,以后会写文章对ConcurrentHashMap做一个详细的总结。一、设计思路 HashMap:线程不安全的,内部用数组+链表的数据结构存储数原创 2017-04-25 21:35:34 · 378 阅读 · 0 评论 -
ThreadLocal的局限性——内存泄漏问题
通过前两篇文章,我们了解了ThreadLocal的内部是怎么实现的,那么这样实现ThreadLocal会带来什么问题呢?首先我们先看一张图来理一理Thread和ThreadLocal的关系: ThreadLocal是一个能更够实现线程内数据共享的类,而通过get(Thread t)方法,我们知道实际的数据以键值对的形式保存在Thread的一个叫ThreadLocalMap类型的属性中,而Thr原创 2017-04-24 17:15:20 · 550 阅读 · 0 评论 -
ThreadLocal源码解析(二)
上一篇文章主要讲述了Thread和ThreadLocal的关系以及ThreadLocal是怎么存储数据的,本文将讲述ThreadLocal中的一个内部类static class ThreadLocalMap,这个类与HashMap类似,但是跟HashMap没有任何关系,甚至与Map都没有关系,我们主要通过源码来看看该类是什么实现这个功能的。1.ThreadLocalMap中有一个内部类Entry :原创 2017-04-23 20:25:42 · 262 阅读 · 0 评论 -
ThreadLocal源码解析(一)
1.ThreadLocal中涉及到的几个重要类 • Thread:表示一个线程 • ThreadLocal:本文要解析的这个类 • ThreadLocalMap:ThreadLocal类中的一个内部类,这个类相当于一个HashMap类,但是跟HashMap没有任何关系,内部实现跟HashMap类似 • ThreadLocalMap.Entry:把它看成是保存键值对的对象,其本原创 2017-04-23 19:08:28 · 278 阅读 · 0 评论 -
java中sleep()和wait()的区别
这两个方法主要来源是,sleep用于线程控制,而wait用于线程间的通信,与wait配套的方法还有notify和notifyAll.区别一: sleep是Thread类的方法,是线程用来控制自身流程的,比如有一个要报时的线程,每一秒中打印出一个时间,那么我就需要在print方法前面加上一个sleep让自己每隔一秒执行一次。就像个闹钟一样。通常我们在写demo的时候,用sleep()方法,通常是为了原创 2017-04-17 10:37:58 · 455 阅读 · 0 评论 -
多个线程之间共享数据
多个线程之间共享数据,首先想到的是将共享数据设置为全局变量,并且用static修饰,但是static修饰的变量是类变量,生命周期太长了,占用内存,本文将介绍三种方法实现多个线程之间共享数据。方法一:多个线程对共享数据的操作是相同的,那么创建 一个Runnable的子类对象,将这个对象作为参数传递给Thread的构造方法,此时因为多个线程操作的是同一个Runnable的子类对象,所以他们操作的是同一原创 2017-04-06 08:41:44 · 2200 阅读 · 1 评论 -
实现线程内共享数据(一)
本文主要实现线程范围内共享数据,即当前线程运行的时候,得到该线程对应的数据,保证该线程每次运行的时候数据是共享的。 思路: 将当前线程对象和数据保存保存在map集合中,当该线程运行的时候,从根据当前线程对象,从map集合中获取到对应的数据,进行操作。原创 2017-03-25 17:07:10 · 560 阅读 · 0 评论 -
实现线程内共享数据(二)
本文主要介绍利用java提供的ThreadLocal类去实现线程之间的数据共享。 ThreadLocal内部是一个Map来存放当前线程对象Thread和数据,一个ThreadLocal对象只能存放一个数据,要想存放多个数据,可以创建多个ThreadLocal对象或者将数据打包成一个pojo对象,将pojo对象存放在1ThreadLocal中。本文存放pojo对象,用单例的形式实现pojo对象类。原创 2017-03-27 16:18:49 · 329 阅读 · 0 评论 -
java中的线程池
当我们在执行任务的时候去创建线程,这样实现起来非常简单。 但是在并发的线程非常多的时候,并且每个线程执行一个时间很短的任务就结束了,这样频繁的创建线程,大大降低了系统的效率,因为创建线程和销毁线程需要消耗时间和系统的cpu。 java中可以使用线程池是得线程可以复用,就是说完成一个任务,并不销毁,还可以去执行其他的任务。java.uitl.concurrent.ThreadPoo原创 2017-04-09 10:57:29 · 319 阅读 · 0 评论 -
多线程中的读写锁
在多线程并发的情况下,读线程不会发生冲突,但是多线程同时写的情况下容易发生并发冲突,为了解决这个问题,java中提供了一个读写锁的类。读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。总之,读的时候上读锁,写的时候原创 2017-04-16 16:51:04 · 1113 阅读 · 1 评论 -
用HashMap和双链表实现多线程下的LRU缓存算法(java版)
缓存的目的:缓存主要为了保存数据的,在项目中,开启服务器的时候,将访问量大的数据从数据库中查到,放入到缓存中,服务器开启后,用户从前端向后台发送请求,直接从缓存中去取,不用查数据库,加快数据的访问。我的缓存的需求:主要想保存ArticleBean(中有很多属性),加入到缓存的时候按照点击量的降序,定时更新缓存的时候能将按照点击量的降序加入到合适的位置,而查找文章的时候需要根据文章的id直接缓存中去获原创 2017-04-19 19:07:15 · 2374 阅读 · 1 评论 -
用Condition实现线程间高效通信
Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set (wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用.举例说明condition的用法: 例子一:原创 2017-04-18 20:19:29 · 361 阅读 · 0 评论