线程
仅次于鹰
希望这里的资料可以帮到你,大家一起共同进步
展开
-
同步容器类
同步容器类概念 Collections类里面有方法可以将普通的容器加上一把锁 例子如下MapString, String> map = Collections.synchronizedMap(new HashMapString, String>());并发容器类ConcurrentMap 传统方式的缺点运用锁如下图 ConcurrentM原创 2018-01-14 22:41:34 · 213 阅读 · 0 评论 -
线程安全和锁竞争
线程安全线程安全概念:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,name这个类(对象或方法)就是线程安全的.synchronized与锁竞争synchronized:可以在任意对象及方法上枷锁,而加锁这段代码成为”互斥区”或”临界区” 没有线程安全代码如下:public class MyThread extends Thread{ pr原创 2018-01-06 20:22:55 · 650 阅读 · 0 评论 -
多个线程多个锁
多个线程多个锁,多个线程,每个线程都可以拿到自己指定的锁,分别获得锁之后,执行synchronized方法体的内容.synchronized失效问题/** * 关键字synchronized取得的锁都是对象锁,而不是把一段代码(方法)当做锁, * 所以代码中哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁(Lock), * * 在静态方法上原创 2018-01-06 20:56:21 · 244 阅读 · 0 评论 -
对象锁的同步和异步
同步:synchronized 同步的概念就是共享,如果不是共享的资源就没有必要进行同步. 异步: 异步的概念就是独立,相互之间不受到任何制约.就好像我们学习http的时候,在页面发起的Ajax请求,我们还可以继续浏览或操作页面内容,二者之间没有任何关系. 同步的目的是为了线程安全,其实对于线程安全来说,需要满足两个特性; 原子性(同步) 可见性/**原创 2018-01-06 22:02:40 · 231 阅读 · 0 评论 -
线程赃读
对于对象的同步和异步的时候,我们再设计自己的程序的时候,一定要考虑问题的整体,不然就会出现数据不一致的错误,和经典的赃读案例 业务解读:下面代码t1线程还未将 用户名设置完成,主线程就开始读取,从而产生赃读数据/** * 业务整体需要使用完整的synchronized,保持业务的原子性。 * @author CCD * */public class DirtyRead {原创 2018-01-07 08:59:24 · 378 阅读 · 0 评论 -
volatile应用
volatile概念:volatile关键字的作用是使变量在多个线程间可见.在java中,每一个县城都会有一块工作内存区,其中存放着所有线程共享的主内存中的变量值的拷贝.当线程执行时,他在自己的工作内存区中操作这些变量.为了存取一个共享的变量,一个线程通常先获取锁定病区清除他的内存工作区,把这些共享变量从所有的现成的共享内存区中正确的装入到他自己所在的工作内存区中,当线程解锁时保证该工作内存区原创 2018-01-07 10:35:42 · 281 阅读 · 0 评论 -
线程死锁问题
死锁问题,在设计程序时就应该避免双方相互持有对方的锁的情况/** * * @author CCD * */public class DeadLock implements Runnable{ private String tag; private static Object lock1 = new Object(); private static Obje原创 2018-01-07 17:55:52 · 212 阅读 · 0 评论 -
synchronized的方法重入
连续调用synchronized方法public class SyncDubbo1 { public synchronized void method1(){ System.out.println("method1.."); method2(); } public synchronized void method2(){原创 2018-01-07 18:03:16 · 363 阅读 · 0 评论 -
synchronized代码块加锁
使用synchronized代码块加锁,比较灵活public class ObjectLock { public void method1(){ synchronized (this) { //对象锁 try { System.out.println("do method1..");原创 2018-01-07 18:06:48 · 4674 阅读 · 0 评论 -
Java之CountDownLatch
CountDownLatch类介绍1、类介绍 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。下面的代码,先运行t2线程处于等原创 2018-01-07 22:40:20 · 274 阅读 · 0 评论 -
线程间通信wait notfiy 方法,wait释放锁,notfiy不释放锁
先运行t2线程,t2线程处于等待中,再运行t1线程,当t1线程list等于5,会唤醒t2线程,但是t1线程,需要都处理完才会释放锁,所以不能够达到实时通信, 需要达到线程中实时通信要用到CountDownLatch类import java.util.ArrayList;import java.util.List;/** * wait notfiy 方法,wait释放锁,notfiy不释原创 2018-01-07 22:50:00 · 1447 阅读 · 0 评论 -
多线程使用Vector或者HashTable的示例
多线程下Vector和HashTable是线程安全的,因为锁竞争效率很低.解决方案看我其他文章 线程安全代码证明如下import java.util.Collections;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Vector;/** *原创 2018-01-14 22:44:39 · 390 阅读 · 0 评论 -
Queue队列的简单应用
在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列,一个是以BlockingQueue接口为代表的阻塞列队,无论哪种都继承自Queue 如下图所示 ConcurrentLinkedQueue代表的高性能队列ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();原创 2018-01-14 22:07:56 · 952 阅读 · 0 评论