并发,同步锁,Runnable,Callable,Future
1.并发:
在我们的操作系统中,同一个时间点,有N个线程都想访问同一个程序!但是cpu只能运行一个! 这种情况就是! 多个线程在 同一个时间点 访问同一个资源,会引发线程不安全的问题!
怎么解决这种不安全的问题??
01.设置同步代码块
02.设置同步方法
使用的关键字 synchronized 解决! 注意点:
01.在同一个时间点,只能有一个线程进入 synchronized代码块或者方法
02.当一个线程访问 synchronized代码块的时候,其他的synchronized代码块也会被锁定!
03.当一个线程访问 synchronized代码块的时候,其他的线程可以访问非synchronized修饰代码块! 2.Runnable Callable 的区别 Future接口 01.Runnable接口中只有一个方法 public abstract void run();
没有返回值 没有声明异常
02.Callable接口中只有一个方法 V call() throws Exception;
有返回值 有声明异常
03.Callable 接口中的call()的返回值可以用 Future对象来接收 3. Future是一种思想: 1 2 3 4四个人在排队买煎饼!
234是不是需要等待! 假如一人需要等待5分钟!
第四个人4需要等待15分钟!
按照我们现在讲的线程!
123得到煎饼,4必须等待15分钟之后才能得到!
中间4不能离开队列,4白白等待15分钟! Future的核心:
1 2 3 4四个人在排队买煎饼!
假如一人需要等待5分钟!
4知道自己需要等待15分钟!
这时候4可以利用这15分钟去做别的事情!
123买完煎饼之后,4会得到通知,然后回来购买煎饼!
4.同步锁:
/**
* 售票的线程类 实现同步
*/
public class SynchronizedSale implements Runnable { // 定义总票数
private int counts = 10000; // 定义出售票的下标
private int num = 0; @Override
public void run() {
while (true) {
/**
* 在多个线程并发访问我们这个run()的时候
* 只能有一个线程进入我们这个synchronized 同步代码块!
* 第一个线程执行完毕之后,之后的线程才能进入....依次类推
*/
synchronized (this) {
// 如果没有票 退出循环
if (counts <= 0) {
break;
}
counts--; // 卖了一张票
num++;
System.out.println(Thread.currentThread().getName() + "抢到了第"
+ num + "张票!剩余票数:" + counts);
}
}
synchronized (this) {
//当有线程进入一个synchronized代码块时,所有
synchronized代码块都会上锁,不能进入
}
} /**
* 模拟3个人同时抢票
*/
public static void main(String[] args) {
// 实例化线程类对象
SynchronizedSale sale = new SynchronizedSale();
Thread t1 = new Thread(sale, "小黑");
Thread t2 = new Thread(sale, "小白");
Thread t3 = new Thread(sale, "小红");
Thread t4 = new Thread(sale, "小粉");
Thread t5 = new Thread(sale, "小蓝");
System.out.println("开始抢票");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start(); } }
抢票
/**
* 售票的线程类 实现同步
*/
public class SynchronizedSaleMethod implements Runnable { // 定义总票数
private int counts = 1000; // 定义出售票的下标
private int num = 0; // 定义一个标识
private boolean flag = false; @Override
public void run() {
while (!flag) {
sale(); // 只要还有票 循环的调用卖票的方法
}
} // 同步方法
public synchronized void sale() {
// 如果没有票 退出循环
if (counts <= 0) {
flag = true;
return;
}
counts--; // 卖了一张票
num++;
System.out.println(Thread.currentThread().getName() + "抢到了第" + num
+ "张票!剩余票数:" + counts);
} /**
* 模拟5个人同时抢票
*/
public static void main(String[] args) {
// 实例化线程类对象
SynchronizedSaleMethod sale = new SynchronizedSaleMethod();
Thread t1 = new Thread(sale, "小黑");
Thread t2 = new Thread(sale, "小白");
Thread t3 = new Thread(sale, "小红");
Thread t4 = new Thread(sale, "小粉");
Thread t5 = new Thread(sale, "小蓝");
System.out.println("开始抢票");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start(); } }
抢票
并发,同步锁,Runnable,Callable,Future的更多相关文章
- Java并发编程:ThreadPoolExecutor + Callable + Future(FutureTask) 探知线程的执行状况
如题 (总结要点) 使用ThreadPoolExecutor来创建线程,使用Callable + Future 来执行并探知线程执行情况: V get (long timeout, TimeUnit ...
- java并发编程-Executor框架 + Callable + Future
from: https://www.cnblogs.com/shipengzhi/articles/2067154.html import java.util.concurrent.*; public ...
- Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)
多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线 ...
- JAVA多线程高并发学习笔记(三)——Callable、Future和FutureTask
为什么要是用Callable和Future Runnable的局限性 Executor采用Runnable作为基本的表达形式,虽然Runnable的run方法能够写入日志,写入文件,写入数据库等操作, ...
- Python并发编程-进程 线程 同步锁 线程死锁和递归锁
进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...
- Java 并发编程——Callable+Future+FutureTask
Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...
- Java并发编程之Lock(同步锁、死锁)
这篇文章是接着我上一篇文章来的. 上一篇文章 同步锁 为什么需要同步锁? 首先,我们来看看这张图. 这是一个程序,多个对象进行抢票. package MovieDemo; public class T ...
- Java Learning:并发中的同步锁(synchronized)
引言 最近一段时间,实验室已经倾巢出动找实习了,博主也凑合了一把,结果有悲有喜,BAT理所应当的跪了,也收到了其他的offer,总的感受是有必要夯实基础啊. 言归正传,最近在看到java多线程的时候, ...
- Java并发编程:同步锁、读写锁
之前我们说过线程安全问题可以用锁机制来解决,即线程必要要先获得锁,之后才能进行其他操作.其实在 Java 的 API 中有这样一些锁类可以提供给我们使用,与其他对象作为锁相比,它们具有更强大的功能. ...
随机推荐
- Cocos Creator 资源加载(笔记)
cc.loader 加载资源动态加载资源要注意两点,一是所有需要通过脚本动态加载的资源,都必须放置在 resources 文件夹或它的子文件夹下.resources 需要在 assets 文件夹中手工 ...
- beego 初体验 - 基础模块 - session, cookie
beego 内建 session 模块 首先,需要在项目中开启 Session,两种方式,以编码的方式或配置 这是代码实现: 配置文件: 这是调用:
- python模块化学习(一)
import time #获取cpu的时间: #获取本地时间: #获取标准时间格式: #获取时间戳: #print(time.clock()) #这个在3即将被舍弃 print(time.proces ...
- IP通信基础学习第三周(上)
TCP的连接情况有:同时打开,同时关闭,拒绝连接,异常终止连接. TCP流量控制的折中方法是滑动窗口协议,且TCP标准强烈不赞成发送窗口沿向后缩回. 在滑动窗口中,当A发送了11个字节的数据时,P3- ...
- 在HTML5的 input:file 上传文件类型控制 遇到的问题
1.input:file 属性的介绍 先瞅代码吧 <form> <input type="file" name="pic" accept=& ...
- Java多态(注意事项)
多态:相同类型的变量.调用同一方法时呈现出多种不同的行为特征,这就是多态. 1.引用变量在编译阶段只能调用其编译时类型所具有的方法,但运行时则执行它运行时类型所具有的方法,因此编写Java代码时.引用 ...
- 基于Docker搭建MySQL多源复制环境
MySQL5.7在主从复制上面相对之前版本多了一些新特性,包括多源复制.基于组提交的并行复制.在线修改Replication Filter.GTID增强.半同步复制增强等. 多源复制:多源复制加入了一 ...
- PHP实现简单发红包(随机分配,平均分配)
最近碰到一些情况,把思路重新整理了一下,敲出代码.记下来,以后可以借鉴,进一步优化等. 大致的思路:红包主要分两种,一种是平均分配,一种是随机分配. 1.平均分配 平均分配相对好理解,只要把钱平均分给 ...
- 使用js方法时,调用的方法名明明一致,但就是不管用,解决
前提:代码全部写对 问题:调用的方法名明明一致,但就是不管用 举例:写了个function delete(){}方法, 点击调用delete方法,onclik="delete()" ...
- AndroBench手机性能测试【转】
本文转载自:https://www.cnblogs.com/jiangzhishan/archive/2018/07/16/9316279.html AndroBench是一个基准测试应用程序,可以衡 ...