并发,同步锁,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 中有这样一些锁类可以提供给我们使用,与其他对象作为锁相比,它们具有更强大的功能. ...
随机推荐
- 58.Less介绍及其与Sass的差异
Less英文官网需要开启VPN才能正常访问,如果你无法打开Less官网,建议您移步到Alexis Sellier领导的团队所译的中文官网Less中文. ——大漠 事实证明,Less——以及Sass对于 ...
- #WEB安全基础 : HTTP协议 | 0x5 URI和URL
URI(统一资源标识符)和URL(统一资源定位符)相信大家都知道URL吧,我们看看它们有什么区别 URI 长得就像这样 /images/hackr.jepg URL 长得像这样 http://hack ...
- usermod - linux修改用户帐户信息
usermod - 修改用户帐户信息 modify a user account usermod [options] user_name usermod 命令修改系统帐户文件来反映通过命令行指定的变化 ...
- android layout文件优化
性能优化1--UI优化 1.使用系统为我们提供了几个抽象的标签①include:重用include中layout属性指定一个外部布局文件,通过该方式则不需要把这个布局文件在该代码中重复的写一遍了. 若 ...
- IP通信基础学习第三周(上)
TCP的连接情况有:同时打开,同时关闭,拒绝连接,异常终止连接. TCP流量控制的折中方法是滑动窗口协议,且TCP标准强烈不赞成发送窗口沿向后缩回. 在滑动窗口中,当A发送了11个字节的数据时,P3- ...
- <转>jmeter(二十一)jmeter常用插件介绍
本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...
- 03:CDN原理
1.1 CDN简介 1.CDN作用(缓存静态资源) 1. CDN的全称Content Delivery Network,(缩写:CDN)即内容分发网络. 2. CDN解决由于网络带宽小.用户访问量大. ...
- 剑指offer(53)表示数值的字符串
题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...
- JS求任意字符串中出现最多的字符以及出现的次数
我爱撸码,撸码使我感到快乐!大家好,我是Counter本节讲讲如何利用JS来查找任意给定的字符串,求字符串中出现次数最多的字符,出现的次数.直接上代码了,该注释的都注释啦.非常轻松加愉快.效果如下: ...
- Paper Read: Convolutional Image Captioning
Convolutional Image Captioning 2018-11-04 20:42:07 Paper: http://openaccess.thecvf.com/content_cvpr_ ...