多线程de小事情

导航不迷路:

  1. 程序、进程以及线程的爱恨情仇
  2. 最简单实现多线程的方法(Thread)
  3. 简单易懂的多线程(通过实现Runnable接口实现多线程)
  4. 常用获取线程基本信息的方法(新手专属)
  5. 多线程别怕,有锁就安全;(解决线程安全问题)

文章目录

  • 多线程de小事情
  • 预备知识:
  • 线程的状态
    • 1.新生状态;
    • 2.就绪状态;
    • 3.运行状态;
    • 4.阻塞状态;
      • 有四种原因导致阻塞状态;
    • 5.死亡状态;
      • 导致死亡状态有两个原因;
  • 多线程在访问共享资源时的确有优点,速度快;但是会出现安全性问题,数据错乱;
    • 案例:设计一个火车售票模拟程序;假如只剩五张票,三个窗口同时售票,每个窗口都有100人在排队;
  • つづく…

预备知识:

在探索多线程安全问题之前,我们需要了解一些相关知识;

线程的状态

1.新生状态;

用new关键字创建一个线程后,这个线程就是出于新生状态;

2.就绪状态;

线程的Start()方法被调用后,等待分配CPU时就是处于就绪状态(也称之为有资源无资格);

3.运行状态;

线程的run()方法被执行,被CPU选中;(有资源,有资格)

4.阻塞状态;

暂停某个线程的执行,等待某个条件的发生;

有四种原因导致阻塞状态;

1.执行sleep()方法,使当前线程休眠,处于阻塞状态;当指定时间到达后进入就绪状态;

代码如下:

package com.bjsxt.threadMethod;public class MyThreadSleep implements Runnable{@Overridepublic void run() {try {System.out.println("my线程睡着了");Thread.sleep(1000);System.out.println("my线程醒了");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

测试类代码:

package com.bjsxt.threadMethod;public class TestSleep {public static void main(String[] args) throws InterruptedException {MyThreadSleep my = new MyThreadSleep();Thread t = new Thread(my);t.start();System.out.println("主线程睡着");Thread.sleep(2000);System.out.println("主线程醒了");}
}

运行效果:

2.执行wait()方法,使当前线程进入阻塞状态,当调用notify()方法唤醒这个线程后,进入就绪状态;

暂时不做演示:在后续生产者、消费者模式中进行演示;

3.Join()线程联合:当某个线程需要等待另一个线程执行结束后,才能执行是使用join()方法;

代码如下:

public class MyThreadJoin1 implements Runnable{@Overridepublic void run() {for(int i=0;i<10;i++) {System.out.println(Thread.currentThread().getName()+"----"+i);}}
}

测试类代码:

public class TestJoin1 {public static void main(String[] args) throws InterruptedException {MyThreadJoin my = new MyThreadJoin();Thread t = new Thread(my);t.start();for(int i=0;i<10;i++) {if(i==2) {t.join();}System.out.println("----------"+Thread.currentThread().getName()+"---"+i);}}}

运行效果:

4.线程运行时,某个操作进入阻塞状态,比如io流(read(),write()方法本身就是阻塞的 方法)只有当阻塞原因消失后,线程才会进入就绪状态;

5.死亡状态;

死亡状态是线程的最后一个状态;

导致死亡状态有两个原因;

1.线程正常执行结束;

2.强制终止线程;
当线程处于死亡状态后,不能再回到其他状态;

多线程在访问共享资源时的确有优点,速度快;但是会出现安全性问题,数据错乱;

案例:设计一个火车售票模拟程序;假如只剩五张票,三个窗口同时售票,每个窗口都有100人在排队;

车票类代码:

public class Ticket implements Runnable{private int ticket=5;@Overridepublic void run() {for(int i=0;i<100;i++) {if(ticket>0) {try {Thread.sleep(3000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(Thread.currentThread().getName()+"正在卖第"+ticket--+"张票");}}}  }

测试类代码

public class TestTicket {public static void main(String[] args) {Ticket t = new Ticket();Thread thread1 = new Thread(t,"A窗口");Thread thread2 = new Thread(t,"B窗口");Thread thread3 = new Thread(t,"B窗口");thread1.start();thread2.start();thread3.start();}}

效果图:
如图所示由于多线程的安全问题导致数据错乱的问题;


つづく…

感谢您的观看;后续仍然会不断更新多线程,最终会以生产者消费者模式的小项目结束;
敬请期待;

多线程,你觉得你安全了?(线程安全问题)相关推荐

  1. iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(上)

    2017-07-08 remember17 Cocoa开发者社区 目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 ...

  2. 多线程的创建方式和解决线程安全问题

    一  基本概念 ①程序(program)是为完成特定任务.用某种语言编写的一组指令的集合.即指一 段静态的代码,静态对象. ②进程(process)是程序的一次执行过程,或是正在运行的一个程序.是一个 ...

  3. iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(下)

    2017-07-08 remember17 Cocoa开发者社区 7NSOperation的理解与使用 No.1:NSOperation简介 NSOperation是基于GCD之上的更高一层封装,NS ...

  4. Java多线程基础-6:线程安全问题及解决措施,synchronized关键字与volatile关键字

    线程安全问题是多线程编程中最典型的一类问题之一.如果多线程环境下代码运行的结果是符合我们预期的,即该结果正是在单线程环境中应该出现的结果,则说这个程序是线程安全的. 通俗来说,线程不安全指的就是某一代 ...

  5. java线程安全问题之静态变量、实例变量、局部变量

    转载 java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编程实践>中所说: 写道 给线程安全下定义比较困难.存在很多种定 ...

  6. 关于SimpleDateFormat时间格式化线程安全问题

    转载自  关于SimpleDateFormat时间格式化线程安全问题 昨天推送的文章<关于创建和销毁对象>一文中,2.1重复利用对象这一小节所举的SimpleDateFormat格式化时间 ...

  7. java 线程安全问题之静态变量、实例变量、局部变量

    2019独角兽企业重金招聘Python工程师标准>>> java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编 ...

  8. java 恶汉和懒汉_Java单例模式-懒汉式、恶汉式与线程安全问题

    Java的单例模式常见的分为懒汉式.饿汉式.静态内部类.枚举 通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数额控制并节约系统资源. 饿汉式: public cl ...

  9. java static 线程安全_java静态方法的线程安全问题

    类的成员分为两类,静态成员(static member)和实例成员(instance member).静态成员属于类,实例成员则属于对象,即类的实例. 简单讨论一下在一个类中使用静态字段(static ...

  10. hash是线程安全的吗?怎么解决?_这次进程、线程、多线程和线程安全问题,一次性帮你全解决了...

    1. 什么是进程 一个软件,在操作系统中运行时,我们称其为进程. 进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元. 2. 什么是线程 在一个进程中,每个独立的功能都需要独立的去运行,这 ...

最新文章

  1. OpenGL学习笔记(2) 画一个正方形
  2. oracle ora 16014,ORACLE ORA-16014+ORA-00312 数据库在线重做日志没有归档
  3. 基于Angularjs实现分页
  4. jzoj4227-B【dp,字符串】
  5. java 获取手机归属地,引起net.UnknownHostException错误
  6. 2021年慈溪中学高考成绩查询,2021年慈溪市高考状元名单资料,今年慈溪市高考状元多少分...
  7. [Java并发编程实战] 简介
  8. 下载spring源码
  9. 计算机中丢失xvidcore.dll,win7系统提示“xvidcore.dll not found”的解决方法
  10. javascript连接数据库
  11. 离散时间傅里叶变换(一)
  12. 万用表测试软件,最全的万用表使用方法看这里!
  13. miui7 android系统版本,miui7系统
  14. 市占率第一,是vivo的起点还是终点?
  15. select函数作用
  16. 国密算法SM3与SM4简介与应用
  17. IMAP工作原理及特性/imap协议pop协议mail协议
  18. c语言零基础自学,c语言零基础入门 该如何学习
  19. 利用JS实现简易ATM机
  20. 解决element-UI中分页组件显示英文

热门文章

  1. MQTT——QoS服务质量等级
  2. Linux设置SSH登录(SecureCrt)
  3. JavaScript学习总结(二)数组和对象部分
  4. C#命令行编辑器csc.exe
  5. windows2003 DHCP中批处理绑定IP与MAC
  6. 完成了WF工作流持久化和对持久化介质数据的加载, 但是仅仅用持久化,不能够保存工作流当前的执行状态,需要跟踪服务支持,怎样使用Tracing 服务呢?...
  7. AB1601中volatile的使用
  8. (chap8 确认访问用户身份的认证) BASIC认证(基本认证)
  9. 比特币钱包(5) BIP44 账户表示形式
  10. Cryptohack-RSA writeups