java架构《并发线程基础二》
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的示例(简单线程同步问题)
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架构《并发线程基础二》的更多相关文章
- java架构《并发线程高级篇四》
本章主要讲并发线程的常见的两种锁.重入锁和读写锁 一:重入锁(ReentrantLock) 概念:重入锁,在需要进行同步的代码加锁,但最后一定不要忘记释放锁,否则会造成锁永远不能释放,其他线程进不了 ...
- java架构《并发线程高级篇一》
本章主要记录讲解并发线程的线程池.java.util.concurrent工具包里面的工具类. 一:Executor框架: Executors创建线程池的方法: newFixedThreadPool( ...
- java架构《并发线程高级篇二》
本章主要记录讲解并发线程的线程池.使用Executor框架自定义线程池. 自定义线程池使用Queue队列所表示出来的形式: 1 ArrayBlockingQueue<Runnable>(3 ...
- java架构《并发线程高级篇三》
本章主要介绍和讲解concurrent.util里面的常用的工具类. 一.CountDownLatch使用:(用于阻塞主线程) 应用场景 :通知线程休眠和运行的工具类,是wait和notify的升级版 ...
- Java高并发 -- 线程池
Java高并发 -- 线程池 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 在使用线程池后,创建线程变成了从线程池里获得空闲线程,关闭线程变成了将线程归坏给线程池. ...
- Java高并发--线程安全策略
Java高并发--线程安全策略 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 不可变对象 发布不可变对象可保证线程安全. 实现不可变对象有哪些要注意的地方?比如JDK ...
- Java并发-线程池篇-附场景分析
作者:汤圆 个人博客:javalover.cc 前言 前面我们在创建线程时,都是直接new Thread(): 这样短期来看是没有问题的,但是一旦业务量增长,线程数过多,就有可能导致内存异常OOM,C ...
- Java高并发与多线程(四)-----锁
今天,我们开始Java高并发与多线程的第四篇,锁. 之前的三篇,基本上都是在讲一些概念性和基础性的东西,东西有点零碎,但是像文科科目一样,记住就好了. 但是本篇是高并发里面真正的基石,需要大量的理解和 ...
- Java之创建线程的方式四:使用线程池
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.c ...
- java架构《并发线程中级篇》
java多线程的三大设计模式 本章主要记录java常见的三大设计模式,Future.Master-Worker和生产者-消费者模式. 一.Future模式 使用场景:数据可以不及时返回,到下一次实际要 ...
随机推荐
- 移动端学习之理解WEB APP、Native APP、Hybrid APP以及React Native/uniapp包括H5、小程序等的区别与共通之处
因为工作需要,需要进一步了解移动端的开发,遂返回复习移动端的知识点,在开始学习之前,产生了疑惑WEB APP .Native APP .Hybrid APP.React Native.Uniapp.H ...
- git基础-远程仓库的使用
远程仓库的使用 为了能在任意 Git 项目上协作,你需要知道如何管理自己的远程仓库. 远程仓库是指托管在因特网或其他网络中的你的项目的版本库. 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以 ...
- ARM杂散知识
画重点: 1.存储器格式:重点是大小端识别 经常考 2.对齐后结构体占用空间大小:使用aligned,packed,#pragma pack()三种方式都要会 Thumb指令集 Thumb指令集能够以 ...
- user&group_management.md
登录shell bin/bash sbin/nologin useradd 的参数 -c comment 用户的注释性信息 -u UID 指定用户的UID -g initia ...
- Mirai框架qq机器人教程 新版
Mirai框架qq机器人教程 新版 前言 资料列表 1.准备 i. 配置java环境 ii. 配置IDE iii. 下载mirai-console-loader(mcl)作为启动器 2.创建mirai ...
- 牛客网NC15二叉树的层次遍历
题目 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], [1 ...
- select 里面带的值居然是估算的?
mysql> set profiling=1;Query OK, 0 rows affected, 1 warning (0.07 sec) mysql> select count(1) ...
- Array.of使用实例
Array.of是es6新增的API,其实粗暴点理解,光看of,就可以猜到它是数组的意思,所以猜测可以用来把字符串转换成数组. 像这样的table,有批量删除和单个删除的功能,,但是又不想写两个方法, ...
- OLED的波形曲线、进度条、图片显示(STM32 HAL库 模拟SPI通信 5线OLED屏幕)详细篇
少废话,先上效果图 屏幕显示效果 全家福 一.基础认识及引脚介绍 屏幕参数: 尺寸:0.96英寸 分辨率:128*64 驱动芯片:SSD1306 驱动接口协议:SPI 引脚说明: 二. ...
- 转 16 jmeter中的监听器以及测试结果分析
16 jmeter中的监听器以及测试结果分析 常用监听器 断言结果.查看结果树.聚合报告.Summary Report.用表格查看结果.图形结果.aggregate graph等 指标分析 -Sa ...