多线程
藤原豆腐店-
准备迁移博客,新博客地址:https://www.jianshu.com/u/16102e967c0f
展开
-
java多线程sleep,wait,yield方法区别
sleep()方法sleep()的作用是在指定的毫秒数内让当前“正在执行的线程”休眠(暂停执行)。这个“正在执行的线程”是指this.currentThread()返回的线程。sleep方法有两个重载版本:sleep(long millis) //参数为毫秒sleep(long millis,int nanoseconds) //第一参数为毫秒,第二个参数为纳秒sle...原创 2019-02-26 17:19:58 · 1079 阅读 · 0 评论 -
Java多线程学习(十)CompletionService学习
CompletionService整合了Executor和BlockingQueue的功能。可以将多个Future任务添加到BlockingQueue的队列中,然后获取是可以调用take(阻塞)或poll(非阻塞)方法从队列中获取任务的执行结果。添加到队列中的任务时按照执行完成时间的顺序添加进去的,先完成的任务先添加到队列中,所以从队列中获取任务结果也一定是先获取到最先计算完成的。 E...原创 2019-02-26 16:57:56 · 225 阅读 · 0 评论 -
Java多线程学习(十一)中断机制interrupt学习
在实际应用中,如果想停掉某个线程,那么可以调用线程的stop()方法或者suspend()方法来强制性的停止某个线程。但是这种方法是很粗暴的,它是强制性的停止线程,这样可能会导致线程之前工作的数据丢失,所以Java已经摒弃了这些强制终止的方法。取而代之的是一种中断机制,interrupt()方法。在JVM中每个线程都有一个boolean类型的线程是否中断的标志,调用线程中断的方法只是将这个标志...原创 2019-02-26 16:57:51 · 372 阅读 · 0 评论 -
Java多线程学习(十二)并行递归算法学习
并行循环如果一个循环中的每次迭代都是独立的,彼此没有影响,那可以将一个顺序的循环变成一个并行的循环。//顺序执行 void processSequentially(List<Element> elements){ for (Element e:elements) { process(e); } } ...原创 2019-02-26 16:57:41 · 4409 阅读 · 0 评论 -
JMeter压力测试工具使用
1.新建测试计划,选择添加,线程。2.点击http请求,配置协议、ip、端口、路径、请求方式、参数。get方式直接在parameters中配置即可,如果是post方式,要在bodydata中添加json形式的数据,并且右键线程组,add。添加一个HTTP Header Manager。点击add,添加发送数据的格式.3.如果已经有写好的测试数据文件,右键...原创 2019-03-05 16:03:56 · 231 阅读 · 0 评论 -
Java循环中创建多个对象是几个引用?以及是否线程安全
在循环中,通过User user = new User();这种方式创建的对象。每次创建的对象是不同的,但是引用是同一个,引用的生命周期是单次循环,下次循环会覆盖调上次的引用。比如这段代码: int minId = 0; while (true){ List<InvitationRel> invitationRelList...原创 2019-03-05 16:06:29 · 2150 阅读 · 0 评论 -
局部变量、实例变量的线程安全性
局部变量是线程安全的。因为局部变量是声明在方法中的变量,方法是放在JVM内存中的方法区的,为方法分配内存的时候并不会为局部变量分配内存,只有在有线程在调用方法的时候才会为局部变量分配内存,并且局部变量是分配在栈上的,栈空间是线程私有的,所以,每当有线程执行方法,都会为其在栈上分配一个局部变量的空间。所以局部变量是属于线程的,是线程安全的。实例变量的线程安全要分两种情况来说。对于单例模式下对象的...原创 2019-03-05 16:06:37 · 854 阅读 · 0 评论 -
Java中的ThreadLocal、ThreadLocalMap原理学习
public class ThreadLocalTest { public static void main(String[] args) { final ThreadLocal<Integer> local = new ThreadLocal<>(); local.set(10); Thread t = new T...原创 2019-03-06 10:26:47 · 1479 阅读 · 0 评论 -
Java多线程学习(五)同步容器与并发容器,ConcurrentHashmap,CopyOnWriteArrayList
同步容器:同步容器是将所有的方法都加了synchronized修饰,每个方法都要同步来执行,虽然保证了线程安全,但是因为线程获得的锁是整个对象的锁,所以降低了性能。比如说Vector这个容器,Vector就是加了synchronized修饰的ArrayList,ArrayList和LinkedList都不是线程安全的,如果要用线程安全的list,可以使用Vector,不过更好的方法是使用C...原创 2019-02-26 17:16:08 · 272 阅读 · 0 评论 -
Java多线程学习(三)Atomic原子变量学习 线程安全委托
要让一个类是线程安全的,可以将这个任务委托给类中的状态变量,让这些状态变量成为线程安全的,那么这个类也就是线程安全的了。比如一个响应事件的类,鼠标事件和键盘事件是完全无关的,也就是说这连个变量是彼此独立的,那么可以将类的线程安全委托给这两个变量。public class VisualComponent { private final List<KeyListener>...原创 2019-02-26 17:16:16 · 578 阅读 · 0 评论 -
Java多线程学习(一)volatile解析
锁的基本特性是同步、互斥、内存可见。synchronized内部锁是可重进入的,意思就是当一个线程获得了这个锁,那么它可以调用这个锁中的方法或者变量多次。这样有利于子类在重写了父类的锁方法之后再调用父类的锁方法。因为锁是基于线程的。Atomic关键字可以保证对修饰变量的操作都是原子的。锁的获得和释放也是需要开销的,所以不能频繁的获得和释放锁。长时间的占有锁会引起性能和活跃度的问题。...原创 2019-02-26 17:16:25 · 223 阅读 · 0 评论 -
多线程怎么避免死锁
当两个线程同时运行时,A线程拥有lock A,在等待lock B,而B线程拥有lock B,在等待lock A,那么这两个线程都在等待对方释放锁,并且谁也不会先释放锁,那么就陷入了死锁。死锁的解决办法有三个,设置加锁顺序、设置加锁时限、开启死锁检测。 加锁顺序当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生。如果能确保所有的线程都是按照相同的顺序获得锁,那么死锁...原创 2019-02-26 17:19:49 · 3781 阅读 · 1 评论 -
java多线程之生产者消费者模型
生产者-消费者模型生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。解决方法就是一个线程负责生产数据,放到共享区域,然后通知另一个线程去消耗数据。如果没有wait()和notify(),消费者线程就要不停去检查是否有数据被产生。代码如下:...原创 2019-02-26 17:19:26 · 302 阅读 · 0 评论 -
Java多线程学习(六)FutureTask,Future,Callable学习
Callable通常来说,创建多线程的方式有两种,继承Thread或者实现Runnable接口。但是这两种方式中的run方法返回值都是void,当我们希望在线程执行完的时候返回一个结果时,我们可以使用实现Callable接口来创建线程。Callable接口的源码如下:public interface Callable<V> { V call() th...原创 2019-02-26 16:59:44 · 296 阅读 · 0 评论 -
Java多线程学习(七)CountDownLatch闭锁学习
CountDownLatch是一个同步辅助类,当我们需要完成某些事A,B才能执行其他事C时,也就是A,B是C发生的前提,这个时候就可以使用CountDownLatch,CountDownLatch是通过一个计数器来实现的,计数器在创建的时候需要赋一个初始值。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任...原创 2019-02-26 16:59:40 · 325 阅读 · 0 评论 -
Java多线程学习(八)Semaphore信号量学习
Semaphore是计数信号量,它管理了一定数量的许可证,每个线程要使用资源必须获得许可证,使用完了再释放许可证。当许可证被发放完了时,其他线程再想获得,必须等待,即进入了阻塞状态,当有线程释放了许可证时,它才能获得执行。 方法摘要 void acquire() 从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。 void...原创 2019-02-26 16:59:35 · 226 阅读 · 0 评论 -
Java多线程学习(九)CyclicBarrier学习
CyclicBarrier类似于闭锁,但是CyclicBarrier要等待一组线程同时到达某个屏障,先到达的线程要等待其他线程到达,等达到了屏障要求的线程数量,这些线程才能继续执行。API中的解释:CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待...原创 2019-02-26 16:59:31 · 518 阅读 · 0 评论 -
Java多线程学习(四)同步容器的复合操作
Java中给我们提供了一些同步容器(Collection),这些容器本身是线程安全的,但是对于一些复合操作,有时就需要额外的客户端加锁进行保护。复合操作包括迭代(反复获取元素,直到容器中的最后一个元素)、导航(根据一定顺序查找下一元素)、条件运算(比如缺少即加入)。这种复合操作对于本身是线程安全的同步容器来说,如果多个线程并发访问,可能就会出现问题。比如,线程安全的vector容器,他的获取最...原创 2019-02-26 17:16:12 · 1054 阅读 · 0 评论 -
Java多线程学习(二)ThreadLocal原理和作用
在多线程中,遇到线程安全性的问题,一般有两种解决办法:一、使用同步控制的synchronized,将并发变成同步,是一种时间换空间的办法,有时候效率较低。二、使用ThreadLocal线程本地存储,为各个线程分配一个变量的副本,每个线程都是操作的自己的变量,读写不会干扰到其他线程,实现了数据隔离,是一种空间换时间的办法。不过因为ThreadLocal为每个线程都分配了一份拷贝,如果不及时回...原创 2019-02-26 17:16:21 · 283 阅读 · 0 评论