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. android studio java: -source 1.6 中不支持 switch 中存在字符串 的错误

    F4打开open moudle setting 将source Compatibility 改为1.7 F4打开open moudle setting 将targetCompatibility 改为1 ...

  2. sublime----------快捷键的记录

    1.鼠标选中多行,按下 Ctrl Shift L (Command Shift L) 即可同时编辑这些行: 2.鼠标选中自定义的多行,ctrl+鼠标左键

  3. Kubernetes资源管理

    目录贴:Kubernetes学习系列 1.资源模型 虛拟化技术是云计算平台的基础,其目标是对计算资源进行整合或划分,这是云计算管理平台中的关键技术.虚拟化技术为云计算管理乎台的资源管理提供了资源调配上 ...

  4. DB2 错误代码

    sqlcode sqlstate 说明 000 00000 SQL语句成功完成 01xxx SQL语句成功完成,但是有警告 +012 01545 未限定的列名被解释为一个有相互关系的引用 +098 0 ...

  5. FAT32文件系统学习(上)

    2011-06-02 22:30:48 目的:需要编写SD读图片的底层驱动程序.所以要了解一个SD卡常用文件系统基本概念.累计学习用时2.5小时. 一,FAT32的保留区 1,引导扇区 :引导扇区是F ...

  6. GO数据类型

    基本数据类型 Go语言中有丰富的数据类型,除了基本的整型.浮点型.布尔型.字符串外,还有数组.切片.结构体.函数.map.通道(channel)等. 整形 获取对象的长度的内建len()函数返回的长度 ...

  7. javax.el.PropertyNotFoundException: Property 'know_id' not found on type java.lang.String

    今天通过Servlet明明查出来了结果,在跳转到页面时报这个异常.根据经验仔细核对了字段书写时,未发现错误. 耐心仔细检查之后发现el表达式的List集合写错了 <c:forEach items ...

  8. MySQL插入更新_ON DUPLICATE KEY UPDATE

    前提:操作的表具有主键或唯一索引 INSERT INTO:表中不存在对应的记录,则插入:若存在对应的记录,则报错: INSERT INTO IGNORE:表中不存在对应的记录,则插入:若存在对应的记录 ...

  9. Mysql 数据库介绍

    数据库介绍 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API接口用于创建,访问,管理,搜索和复制所保存的数据. 我们也可以将数据存储在文件中, ...

  10. ORA-55617解决方法

    昨天一测试环境出现异常ORA-55617: Flashback Archive "XXXXX" runs out of space and tracking on "XX ...