并发,同步锁,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 中有这样一些锁类可以提供给我们使用,与其他对象作为锁相比,它们具有更强大的功能. ...
随机推荐
- 57.搭建Vue环境
nodejs官网http://nodejs.cn/下载安装包,无特殊要求可本地傻瓜式安装,这里选择2017-5-2发布的 v6.10.3 cmd命令行: node -v //显示node版本 v6.1 ...
- Qt 半模式对话框
今天看视频,学习好半模式对话框,好新奇哟,这里记录下来. 半模式对话框,介于模式对话框和飞模式对话框之间.半模式对话框会像模式对话框一样阻塞主界面的事件响应,同时,半模式对话框会像非模态对话框一样,立 ...
- #WEB安全基础 : HTTP协议 | 0x8 HTTP的Cookie技术
说道Cookie,你喜欢吃饼干吗? 这里的Cookie不是饼干=_= HTTP不对请求和响应的通信状态进行保存,所以被称为无状态协议,为了保持状态和协议功能引入了Cookie技术 Cookie技术在请 ...
- Android-Gradle(一)
理解基本的Gradle 如果你想创建一个Android project基于gradle,那么你必须写一个构建脚本,这个文件通常称之为build.grade,你可能已经觉察到了,当我们查看这一脚本,gr ...
- python selenium基于显示等待封装的一些常用方法
import os import time from PIL import Image from selenium import webdriver from appium import webdri ...
- 爬虫----BeautifulSoup模块
一.介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你 ...
- 利用“Java同包同名类执行顺序”取消Java 网站应用程序Licence验证
如果是在tomcat里运行,lib目录下一大堆的JAR包,不同的JAR包里可能会有相同的包名类名,JRE按照JAR名字的字母顺序加载JAR文件,同名类如果已加载,则后面的同名类会忽略. 公司购买的一款 ...
- myeclipse项目在Tomcat服务器部署问题
错误信息:Deployment of project mybook will replace this resource. Please specify the action you wish to ...
- bzoj4361 isn(树状数组优化dp+容斥)
4361: isn Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 938 Solved: 485[Submit][Status][Discuss] ...
- 搭建一个Web Server站点
题:搭建一个Web Server站点.安装web服务,并在本地创建index.html测试 1.安装http服务 yum -y install httpd 2.进入网站目录 cd /var/www/h ...