1、关键字 volatile
            使用场景: 针对与多线程公用的数据  用volatile关键字修饰  但其不保证原子性(同步)。volatile关键字不具备synchronized关键
                                字的原子性(同步)
            实例讲解:在一个类,启动一个线程, 在线程里面判断如果全局公用的数据发生改变的时候,立即停止线程。

2、关键字  wait notfiy 方法,wait释放锁,notfiy不释放锁
            注意事项:当使用wait 和 notify 的时候 , 一定要配合着synchronized关键字去使用
             解决不释放锁的方式:

          

                   使用import java.util.concurrent.CountDownLatch;的CountDownLatch类
countDownLatch.countDown(); 相当于 notfiy; countDown()会释放锁
countDownLatch.await();相当于 wait;

3、队列 Queue

              BlockingQueue(有界阻塞队列):put(Object): 把Object加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程
被阻断,直到BlockingQueue里面有空间再继续.removeFirst();取走BlockingQueue里排在首位的对象,若
BlockingQueue为空,阻断进入等待状态直到BlockingQueue有新的数据被加入.

4、关键字ThreadLocal
                使用场景:ThreadLocal修饰的集合或者属性 只在当前线程有效 

5、单例模式

 1    public class DubbleSingleton {
2
3
4   private static DubbleSingleton ds;
5
6   public static DubbleSingleton getDs(){
7   if(ds == null){
8   try {
9   //模拟初始化对象的准备时间...
10   Thread.sleep(3000);
11   } catch (InterruptedException e) {
12   e.printStackTrace();
13   }
14   synchronized (DubbleSingleton.class) {
15   if(ds == null){
16   ds = new DubbleSingleton();
17   }
18    }
19 }
20 return ds;
21 }
22 }

6、内部类处理线程安全

 1   public class Singletion {
2
3   private static class InnerSingletion {
4   private static Singletion single = new Singletion();
5   }
6
7   public static Singletion getInstance(){
8   return InnerSingletion.single;
9   }
10
11 }

7、Vector  和HashTable 集合  ,  多线程使用Vector或者HashTable的示例(简单线程同步问题)
                 使用场景:   初始化火车票池并添加火车票:避免线程同步可采用Vector替代ArrayList  HashTable替代HashMap

 
8、ConcurrentHashMap 集合
                 使用场景: 存在相同key  第二次Key保存就会失败 但不会有异常

9、 LinkedBlockingQueue队列
                  使用场景: 阻塞无界队列  peekFirst获取到第一个元素 但不移除  pollLast获取到最后一个元素  会移除
                  注意:初始化没有长度 表示无界   有长度,表示有界

10、 PriorityBlockingQueue队列
                  使用场景: 根据一定规则,自动排序
                  注意事项:机制:队列使用.take()方法时,自动重新排序   如果直接保存,然后for循环打印,不会自动排序

11、 ConcurrentLinkedQueue  高性能无阻塞无界队列
                   使用场景:高并发 高性能数据集合
                       使用方式 :
            

                       增加元素:add(object)  或 offer(object);
移除元素:poll() 从头部取出元素,并从队列里删除
获取元素:peek() 从头部取出元素
 

12、ArrayBlockingQueue  有界队列 初始化必须传长度
                   使用方式:array.offer("a", 2, TimeUnit.SECONDS);  //2S 内加入a  如果加入成功返回true  否则 返回false  
                     注意事项: offer put  add都是阻塞的  

13、LinkedBlockingQueue  阻塞队列  初始化可以不传长度  不传变成无界队列
                特别使用方式:
            

              a.drainTo(list,N)     表示:从队列里面抽出N个元素放在list集合里面
a:表示LinkedBlockingQueue 队列 list为新建的list集合 n:元素个数

14、SynchronousQueue  没有大小的队列。
                使用场景:在特定的日期,不需要队列的时候,要提高性能时,就可以使用SynchronousQueue  。相当于在队列中过一下
                实例://SynchronousQueue没有大小  相当于只是在其中通过一下

 

 1  final SynchronousQueue<String> q = new SynchronousQueue<String>();
2   Thread t1 = new Thread(new Runnable() {
3   @Override
4   public void run() {
5   try {
6   System.out.println(q.take());
7   } catch (InterruptedException e) {
8   e.printStackTrace();
9   }
10   }
11   });
12   t1.start();
13   Thread t2 = new Thread(new Runnable() {
14
15   @Override
16   public void run() {
17   q.add("asdasd");
18   }
19   });
20   t2.start();
21 }
22
23
24

java架构《并发线程基础二》的更多相关文章

  1. java架构《并发线程高级篇四》

    本章主要讲并发线程的常见的两种锁.重入锁和读写锁 一:重入锁(ReentrantLock) 概念:重入锁,在需要进行同步的代码加锁,但最后一定不要忘记释放锁,否则会造成锁永远不能释放,其他线程进不了 ...

  2. java架构《并发线程高级篇一》

    本章主要记录讲解并发线程的线程池.java.util.concurrent工具包里面的工具类. 一:Executor框架: Executors创建线程池的方法: newFixedThreadPool( ...

  3. java架构《并发线程高级篇二》

    本章主要记录讲解并发线程的线程池.使用Executor框架自定义线程池. 自定义线程池使用Queue队列所表示出来的形式: 1 ArrayBlockingQueue<Runnable>(3 ...

  4. java架构《并发线程高级篇三》

    本章主要介绍和讲解concurrent.util里面的常用的工具类. 一.CountDownLatch使用:(用于阻塞主线程) 应用场景 :通知线程休眠和运行的工具类,是wait和notify的升级版 ...

  5. Java高并发 -- 线程池

    Java高并发 -- 线程池 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 在使用线程池后,创建线程变成了从线程池里获得空闲线程,关闭线程变成了将线程归坏给线程池. ...

  6. Java高并发--线程安全策略

    Java高并发--线程安全策略 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 不可变对象 发布不可变对象可保证线程安全. 实现不可变对象有哪些要注意的地方?比如JDK ...

  7. Java并发-线程池篇-附场景分析

    作者:汤圆 个人博客:javalover.cc 前言 前面我们在创建线程时,都是直接new Thread(): 这样短期来看是没有问题的,但是一旦业务量增长,线程数过多,就有可能导致内存异常OOM,C ...

  8. Java高并发与多线程(四)-----锁

    今天,我们开始Java高并发与多线程的第四篇,锁. 之前的三篇,基本上都是在讲一些概念性和基础性的东西,东西有点零碎,但是像文科科目一样,记住就好了. 但是本篇是高并发里面真正的基石,需要大量的理解和 ...

  9. Java之创建线程的方式四:使用线程池

    import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.c ...

  10. java架构《并发线程中级篇》

    java多线程的三大设计模式 本章主要记录java常见的三大设计模式,Future.Master-Worker和生产者-消费者模式. 一.Future模式 使用场景:数据可以不及时返回,到下一次实际要 ...

随机推荐

  1. Mono for android,Xamarin点击事件的多种写法

    (一)原本java的写法(相信很多是学过java的): 需要实现接口View.IOnClickListener,最好也继承类:Activity,因为View.IOnClickListener接口又继承 ...

  2. 被自己以为的GZIP秀到了

    问题的开始 我司某产品线有这么一个神奇接口 (https://host/path/customQuery) 该接口在预发或线上缓存正常的情况下TTFB为150ms左右(可以认为服务处理时间差不多就是T ...

  3. java中装箱,拆箱

    (1)包装类 java中不能定义基本数据类型的对象,但是提供了基本数据类型的包装类来解决这一问题,例如int类型的包装类Integer, 包装类的常用方法有Integer.ParseInt()方法类将 ...

  4. Redis基础篇(八)数据分片

    现在有一个场景:要用Redis保存5000万个键值对,每个键值对大约是512B,要怎么部署Redis服务呢? 第一个方案,也是最容易想到的,需要保存5000万个键值对,每个键值对约为512B,一共需要 ...

  5. 设计模式之单例模式(Singleton Pattern)深入浅出

    单例模式介绍:单例模式是指确保一个类在任何情况下都绝对只有一个实例,并且提供一个全局的访问点.隐藏其所有构造方法,属于创新型模式. 常见的单例有:ServletContext.ServletConfi ...

  6. 浅析 MVC Pattern

    一.前言 最近做CAD插件相关的工作,用到了一些模式,解决对应场景的问题. 比如插件的运行实例上使用Singleton.实例内部使用了MVC(Strategy and Observer ). 针对CA ...

  7. Nginx解决前端访问资源跨域问题

    被前端跨域问题折磨快2天后,终于用ngnx的方式解决了,所以在此总结下. 该篇只探讨如何用Ngnx解决跨域问题,对于原理不作讨论. 1.首先介绍Windows环境下Nignx的相关命令操作 nginx ...

  8. Java进阶基础18天课程大总结

    知识点目录 day1:分类思想,static关键字 day2:面向对象-继承,抽象类,权限修饰符,final day3:接口,多态 day4:内部类,Lambda day5:工具类API,系统API, ...

  9. openstack octavia的实现与分析(一)openstack负载均衡的现状与发展以及lvs,Nginx,Haproxy三种负载均衡机制的基本架构和对比

    [负载均衡] 大量用户发起请求的情况下,服务器负载过高,导致部分请求无法被响应或者及时响应. 负载均衡根据一定的算法将请求分发到不同的后端,保证所有的请求都可以被正常的下发并返回. [主流实现-LVS ...

  10. 2021升级版微服务教程5—通过IDEA运行多个项目实例「模拟集群」

    2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...