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的更多相关文章

  1. Java并发编程:ThreadPoolExecutor + Callable + Future(FutureTask) 探知线程的执行状况

    如题 (总结要点) 使用ThreadPoolExecutor来创建线程,使用Callable + Future 来执行并探知线程执行情况: V get (long timeout, TimeUnit ...

  2. java并发编程-Executor框架 + Callable + Future

    from: https://www.cnblogs.com/shipengzhi/articles/2067154.html import java.util.concurrent.*; public ...

  3. Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)

    多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线 ...

  4. JAVA多线程高并发学习笔记(三)——Callable、Future和FutureTask

    为什么要是用Callable和Future Runnable的局限性 Executor采用Runnable作为基本的表达形式,虽然Runnable的run方法能够写入日志,写入文件,写入数据库等操作, ...

  5. Python并发编程-进程 线程 同步锁 线程死锁和递归锁

    进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...

  6. Java 并发编程——Callable+Future+FutureTask

    Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...

  7. Java并发编程之Lock(同步锁、死锁)

    这篇文章是接着我上一篇文章来的. 上一篇文章 同步锁 为什么需要同步锁? 首先,我们来看看这张图. 这是一个程序,多个对象进行抢票. package MovieDemo; public class T ...

  8. Java Learning:并发中的同步锁(synchronized)

    引言 最近一段时间,实验室已经倾巢出动找实习了,博主也凑合了一把,结果有悲有喜,BAT理所应当的跪了,也收到了其他的offer,总的感受是有必要夯实基础啊. 言归正传,最近在看到java多线程的时候, ...

  9. Java并发编程:同步锁、读写锁

    之前我们说过线程安全问题可以用锁机制来解决,即线程必要要先获得锁,之后才能进行其他操作.其实在 Java 的 API 中有这样一些锁类可以提供给我们使用,与其他对象作为锁相比,它们具有更强大的功能. ...

随机推荐

  1. 数据库SQL的多表查询

    数据库 SQL 的多表查询:eg: table1: employees, table2: departments,table3: salary_grades; 一:内连接: 1):等值连接: 把表em ...

  2. Rdlc 参数问题

    需要sql中的参数自动在生成报表的时候生成的方法: 例如有这样的sql需要自动生成:BeginTime 和 EndTime 两个参数: DECLARE @BeginTime DATETIME='201 ...

  3. DRF之视图类(mixin)源码解析

     同样的增删改查操作,如果我们还像之前序列化组件那样做,代码重复率过多,所以我们用视图表示: 具体源码实现:首先定义一个视图类,然后根据mixin点进去有五个封装好的方法,这五个方法共有的属性就是都需 ...

  4. select报错

    query = query.Where(c => c.MfcKey==temp); int hhho = query.Count(); query = from q in query join ...

  5. CSS 文件引入

    CSS 文件引入 <html> <head> <!-- link标签引用其他文件.rel="stylesheet" 引用css.href=" ...

  6. Bugku-CTF之变量1

    Day9 变量1 http://123.206.87.240:8004/index1.php      

  7. rabbitmq 配置集群镜像

  8. 最新版的Chrome如何始终开启flash而不是先询问?

     链接:https://www.zhihu.com/question/266170237/answer/342137190  设置Chrome启用Flash,修改配置之前先看Chrome的版本,不同版 ...

  9. 浅谈Overload和Override

    Overload是重载的意思,Override是覆盖的意思,也就是重写. 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同). 重写Ove ...

  10. vue--音乐播放器

    github: https://github.com/vinieo/vue-music 效果: 基础组件: 1.confirm:确认对话框组件 2.listview:通讯录列表组件 3.loading ...