JUC学习
JUC是java.util.concurrent包 并发编程的工具包
并发、并行
并发:多线程操作一个资源
并行:多人一起走 并发编程的本质:充分利用cpu的资源
线程的几个状态
新建 运行 堵塞 等待 销毁
wait/sleep区别
1.来自不同的类
wait->object
sleep->Thread
注:实际开发中线程休眠不要用Thread.sleep(5000);
建议使用juc的工具类
TimeUnit.DAYS.sleep(1);//睡1天
TimeUnit.SECONDS.sleep(2);//睡2秒 2.关于锁的释放
wait会释放锁 sleep抱着锁睡了不会释放 3.使用的范围不同
wait:必须在同步代码块中使用
sleep:可以在任何地方睡 //4.是否需要捕获异常
//wait不需要捕获异常 sleep必须捕获异常
Lock锁(重点)
Lock的实现类:
ReentrantLock //可重入锁(常用)
ReentrantReadWriteLock.ReadLock //读锁
ReentrantReadWriteLock.WriteLock //写锁 例子:
class Ticket22{
private int num=50;
Lock lock = new ReentrantLock();
public void sale(){
lock.lock();//加锁
try {
if (num>0){
System.out.println(Thread.currentThread().getName()+"卖出了"+(num--)+"张票,剩"+num);
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();//解锁
}
}
} 主要步骤:
//1.lock加锁
//2.执行方法体
//3.解锁
synchronized锁和Lock的区别
1.synchronized是java内置关键字 Lock是一个java类
2.synchronized无法判断锁的状态 Lock可以判断是否获取到锁
3.synchronized锁会自动解锁 Lock必须手动解锁
4.synchronized锁 线程1获得锁后 线程2只会傻傻的等待
Lock锁线程1获得锁后 线程2不一定会等待(lock.tryLock();)
5.synchronized可重入锁 不能中断 非公平
Lock锁 可重入锁 可以判断锁 非公平(可自己设置)
6.synchronized适合锁少量同步代码 Lock适合锁大量的同步代码
ReadWriteLock(读写锁)
用ReentrantLock锁也可以满足读写接口的线程安全
但若用ReentrantLock锁 读接口也只能跑一个线程了 效率不够高 ReentrantReadWriteLock锁比ReentrantLock锁更加细粒化
在写线程没跑时可以允许多个读线程跑
加锁解锁的写法与ReentrantLock基本一致
private volatile Map map = new HashMap();//volatile多线程读取到变量最新
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
//写入
public void put(String key,Object val){
readWriteLock.writeLock().lock();//写锁锁定
try {
map.put(key,val);
System.out.println("写入");
}catch (Exception e){
e.printStackTrace();
}finally {
readWriteLock.writeLock().unlock();
}
}
//读取
public void get(String key){
readWriteLock.readLock().lock();//读锁
try {
System.out.println(map.get(key));
}catch (Exception e){
e.printStackTrace();
}finally {
readWriteLock.readLock().unlock();
}
}
JUC学习的更多相关文章
- JUC学习笔记(六)
JUC学习笔记(一)https://www.cnblogs.com/lm66/p/15118407.html JUC学习笔记(二)https://www.cnblogs.com/lm66/p/1511 ...
- JUC学习笔记(五)
JUC学习笔记(一)https://www.cnblogs.com/lm66/p/15118407.html JUC学习笔记(二)https://www.cnblogs.com/lm66/p/1511 ...
- JUC学习笔记(四)
JUC学习笔记(一)https://www.cnblogs.com/lm66/p/15118407.html JUC学习笔记(二)https://www.cnblogs.com/lm66/p/1511 ...
- JUC学习笔记(三)
JUC学习笔记(一)https://www.cnblogs.com/lm66/p/15118407.html JUC学习笔记(二)https://www.cnblogs.com/lm66/p/1511 ...
- JUC学习笔记(二)
JUC学习笔记(一)https://www.cnblogs.com/lm66/p/15118407.html 1.Lock接口 1.1.Synchronized 1.1.1.Synchronized关 ...
- JUC学习笔记——进程与线程
JUC学习笔记--进程与线程 在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的进程与线程部分 我们会分为以下几部分进行介绍: 进程与线程 并发与并行 同步与异步 线程详解 进程与线程 ...
- JUC学习笔记——共享模型之管程
JUC学习笔记--共享模型之管程 在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的管程部分 我们会分为以下几部分进行介绍: 共享问题 共享问题解决方案 线程安全分析 Monitor ...
- JUC学习笔记——共享模型之内存
JUC学习笔记--共享模型之内存 在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的内存部分 我们会分为以下几部分进行介绍: Java内存模型 可见性 模式之两阶段终止 模式之Balk ...
- JUC学习记录
先附上学习的博客地址:http://blog.csdn.net/cx8122389/article/details/70049425, 具体见该博客 Java JUC 简介 在Java 5.0 提供了 ...
- JUC学习笔记--Atomic原子类
J.U.C 框架学习顺序 http://blog.csdn.net/chen7253886/article/details/52769111 Atomic 原子操作类包 Atomic包 主要是在多线程 ...
随机推荐
- mysql修改最大连接数
root@localhost ~]# nano /etc/my.cnf编辑my.cnf在[mysqld]中加入:set-variable=max_connections=1000 更改 MySQL 在 ...
- cassandra权威指南读书笔记--引言概要
数据库事务正确执行的四个基本要素事务要有四个基本要素:ACID:原子性(Atomic).一致性(Consistent).隔离性(Isolated).持久性(Durable)原子性(Atomic):整个 ...
- python自动化之使用allure生成测试报告
Allure测试报告框架帮助你轻松实现"高大上"报告展示.本文通过示例演示如何从0到1集成Allure测试框架.重点展示了如何将Allure集成到已有的自动化测试工程中.以及如何实 ...
- C++隐式推导-auto关键词
总述 C++中有一个关键字,它不进行显式声明,而进行隐式推导,auto可以在声明变量时根据变量初始值的类型自动为此变量选择匹配的类型.C++语言类似的关键字还有decltype. 如何评价 C++ 1 ...
- Shiro权限项目
目录 环境配置 spring容器 springmvc freemarker mybatis shiro 工具类 TokenManager.java Result.java 功能实现 登录 注册 个人中 ...
- Hive创建HBase,ES外部表
1.创建HBase外部表 CREATE EXTERNAL TABLE `ods_women`( `rowkey` string COMMENT 'from deserializer', `articl ...
- 宝塔Linux面板FTP无法连接的解决办法
我使用的是阿里云服务器,需要在安全组设置中,对22.21端口放行,并且被动端口(39000 - 40000)也需要处于放行状态(即是指在阿里云安全组的添加端口范围为 39000/40000 的设置) ...
- Codeforces Round #604 (Div. 2) B. Beautiful Numbers(双指针)
题目链接:https://codeforces.com/contest/1265/problem/B 题意 给出大小为 $n$ 的一个排列,问对于每个 $i(1 \le i \le n)$,原排列中是 ...
- HDU 1565 方格取数 状压dp
题目: 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大. Input 包括多 ...
- 数据可视化 -- Python
前提条件: 熟悉认知新的编程工具(jupyter notebook) 1.安装:采用pip的方式来安装Jupyter.输入安装命令pip install jupyter即可: 2.启动:安装完成后,我 ...