JUC 并发编程--01,线程,进程,经典卖票案例, juc的写法
进程: 就是一个程序, 里面包含多个线程, 比如一个QQ程序
线程: 进程中最小的调度单元, 比如 QQ中的自动保存功能
并发: 多个线程操作同一资源, 抢夺一个cpu的执行片段, 快速交替
并行: 多个线程一起执行
线程有几个状态: NEW(新) , RUNNABLE(运行) , BLOCKED(阻塞) , WAITING(无限等待) , TIMED_WAITING(超时等待) , TERMINATED(死亡)
他们之前相互转换关系:

1、新建(new):线程对象被创建后就进入了新建状态。如:Thread thread = new Thread();
2、就绪状态(Runnable):也被称为“可执行状态”。线程对象被创建后,其他线程调用了该对象的start()方法,从而启动该线程。如:thread.start(); 处于就绪状态的线程随时可能被CPU调度执行。
3、运行状态(Running):线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。
4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权限,暂时停止运行。直到线程进入就绪状态,才有机会进入运行状态。阻塞的三种情况:
----4.1)等待阻塞:通过调用线程的wait()方法,让线程等待某工作的完成。
----4.2)同步阻塞:线程在获取synchronized同步锁失败(因为锁被其他线程占用),它会进入同步阻塞状态。
----4.3)其他阻塞:通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或超时、或者I/O处理完毕时,线程重新转入就绪状态。
5、死亡状态(Dead):线程执行完了或因异常退出了run()方法,该线程结束生命周期。
经典的卖票案例: 直接上代码
在这里 线程就是单独的 资源类, 属性--方法, 多个线程来操作同一资源, 这样写的好处是解耦
代码, synchronized 版本的经典的卖票案例
//这是一个资源类
class Ticket {
private int num = 300;
public synchronized void sale(){
if (num > 0) {
System.out.println(Thread.currentThread().getName()+"票的剩余个数为" + num--);
}
}
public static void main(String[] args) {
//多个线程操作同一资源, 这样写解耦,
Ticket ticket = new Ticket();
new Thread(()->{
for (int i = 0; i < 40; i++) {
ticket.sale();
}
},"线程-1").start();
new Thread(()->{
for (int i = 0; i < 40; i++) {
ticket.sale();
}
},"线程-2").start();
new Thread(()->{
for (int i = 0; i < 40; i++) {
ticket.sale();
}
},"线程-3").start();
}
}
代码, Lock 版本的经典的卖票案例:
public class LockDemo {
public static void main(String[] args) {
Ticket_L tick = new Ticket_L();
new Thread(()->{for (int i = 0; i < 40; i++) tick.sale();},"thread-1").start();
new Thread(()->{for (int i = 0; i < 40; i++) tick.sale();},"thread-2").start();
new Thread(()->{for (int i = 0; i < 40; i++) tick.sale();},"thread-3").start();
}
}
//这是一个资源类, 还是卖票案例
class Ticket_L {
private int num = 300;
private Lock lock = new ReentrantLock();
public void sale(){
//先加一把锁
lock.lock();
try {
if(num > 0){
System.out.println(Thread.currentThread().getName()+"票的剩余个数为" + num--);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//释放锁
lock.unlock();
}
}
}
synchronized 和 Lock 区别:
1: synchronized 内置的java关键字, Lock是一个java类
2: synchronized 不能判断获取锁的状态, Lock 可以判断是否获取到了锁,有个方法: lock.tryLock(), 来判断是否已经加了锁
3: synchronized 自动释放锁, Lock必须手动释放锁, 不释放的话,容易造成死锁
4: synchronized 是阻塞的, 比如线程1(获取到锁, 阻塞), 线程2(就等待,一直等待), Lock锁,不一定会一直等下去
5、Synchronized 可重入锁,不可以中断的,非公平;Lock ,可重入锁,可以 判断锁,非公平(可以自己设置);
6、Synchronized 适合锁少量的代码同步问题,Lock 适合锁大量的同步代码!
JUC 并发编程--01,线程,进程,经典卖票案例, juc的写法的更多相关文章
- C++ 并发编程 01 线程api
1.使用多线程的好处: 提高性能,分离关注点 2. 多线程所在头文件 <thread> 3. 使用线程方式为std::thread(functioncall),如: #include & ...
- JUC 并发编程--08,线程池,三大方法,七大参数,4种拒绝策略,代码演示
三大方法: //线程池核心线程数为n, 最大线程数为 n ExecutorService fixedThreadPool = Executors.newFixedThreadPool(n); 源码: ...
- Scala 深入浅出实战经典 第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
- 《转载》Python并发编程之线程池/进程池--concurrent.futures模块
本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...
- JUC并发编程学习笔记
JUC并发编程学习笔记 狂神JUC并发编程 总的来说还可以,学到一些新知识,但很多是学过的了,深入的部分不多. 线程与进程 进程:一个程序,程序的集合,比如一个音乐播发器,QQ程序等.一个进程往往包含 ...
- 并发编程 01—— ThreadLocal
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- 并发编程 13—— 线程池的使用 之 配置ThreadPoolExecutor 和 饱和策略
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- Python3 与 C# 并发编程之~进程先导篇
在线预览:http://github.lesschina.com/python/base/concurrency/1.并发编程-进程先导篇.html Python3 与 C# 并发编程之- 进程篇 ...
随机推荐
- hdu3074 线段树求区间乘积(单点更新)
题意: 给你n个数,两种操作,(1) 把第b个数改成c (2)算出b-c的乘积,结果对1000000007取余. 思路: 线段树单点更新,简单题目,不多解释,具体看代码. #i ...
- PowerShell-3.多线程
$start = Get-Date $task1 = { $vUrl = 'http://img.mottoin.com/wp-content/uploads/2016/09/5-25.png' $v ...
- Vue(1):用Vue-cli构建Vue3项目
使用Vue-cli构建Vue3项目 1.检查node版本 node -v 以上node版本位14.15.0满足Vue3项目的创建条件(Vu3需要node 版本8以上) 为什么需要安装node? vue ...
- 5分钟让你理解K8S必备架构概念,以及网络模型(上)
写在前面 在这用XMind画了一张导图记录Redis的学习笔记和一些面试解析(源文件对部分节点有详细备注和参考资料,欢迎关注我的公众号:阿风的架构笔记 后台发送[导图]拿下载链接, 已经完善更新): ...
- not full 和 default
create table t16( id int, name char(6), sex enum('male','female') not null default 'male'); insert i ...
- .Net平台的GC垃圾回收
一.先了解下必备的知识前提 内存中的托管与非托管,可简单理解为: 托管:可借助GC从内存中释放的数据对象(以下要描述的内容点) 非托管:必须手工借助Dispose释放资源(实现自IDisposable ...
- Java数组学习之前基础小案例
不多说,1天时间看完数组之前内容,这就靠代码的实践总结一下吧~~ 打印三角形 简单易懂,初学都会,就不注释了,前者为取巧的三角形实现方法,我注释了,直接上源码~~ public class Trian ...
- [DB] Hadoop免密登录原理及设置
情景: 现有两台电脑bigdata111.bigdata112,bigdata111想免密码登录bigdata112 过程: 1.bigdata111生成公钥(用于加密,给别人)和私钥(用于解密,自己 ...
- [bug] Container killed on request. Exit code is 143
原因 内存不足 参考 https://blog.csdn.net/hongxiao2016/article/details/88919606 https://blog.csdn.net/Zsigner ...
- 自动做bond的脚本
#!/bin/bash # 先备份原来的网卡配置文件 find /etc/sysconfig/network-scripts/ -type f -name "ifcfg*"|xar ...