`
wststar
  • 浏览: 16996 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

多线程--运行出现了安全问题

阅读更多

/**

多线程--运行出现了安全问题

 通过分析 多线程--简单的卖票程序 

发现 打印出0,-1,-2等错票


 问题的原因:

当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,

还没有执行完,另一个线程参与进来执行。导致共享数据的错误。


解决办法:

对多条操作共享数据的语句,只能让一个线程都执行完。在执行的过程中,其他线程

不可以参与执行。


Java对于多线程的安全问题提供了专业的解决方式


就是同步代码块


synchronized(对象){

需要被同步的代码

}


对象如同锁。持有锁的线程可以在同步中执行。

没有持有锁的线程即使获取cpu的执行权 也进不去 因为没有获取锁


同步的前提:

1.必须要有两个或者两个以上的线程

2.必须是多个线程使用同一个锁


必须保证同步中只能有一个线程在运行


好处:解决的多线程的安全问题

弊端:多个线程都需要判断锁,较为消耗资源

*/


class Ticket implements Runnable

{

private int ticketNum = 100;

Object obj = new Object();


public void run(){

while(true){

synchronized(obj){

if(ticketNum>0){

try{

Thread.sleep(10);

}catch(Exception e){

}

System.out.println(Thread.currentThread().getName()+":sale..." + ticketNum--);

}

}

}

}


}


class  TicketDemo2

{

public static void main(String[] args) 

{


Ticket t = new Ticket();


Thread t1 = new Thread(t);//创建了一个线程

Thread t2 = new Thread(t);//创建了一个线程

Thread t3 = new Thread(t);//创建了一个线程

Thread t4 = new Thread(t);//创建了一个线程

t1.start();

t2.start();

t3.start();

t4.start();


}

}


分享到:
评论

相关推荐

    线程池管理多线程上传

    使用线程池管理多线程上传,包含了文件拆分,文件分片多线程上传,单文件上传。多线程执行任务等待管理。拒绝直接new Thread创建新线程导致的诸多问题

    java多线程安全性基础介绍.pptx

    java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 ...

    Java毕业设计(可运行)多线程与线程安全实践-基于Http协议的断点续传.zip

    Java毕业设计(可运行)多线程与线程安全实践-基于Http协议的断点续传.zip

    多线程操作窗口源码2012813

    多线程是一种提高程序运行效率和性能的常用技术。 随着我们学习工作的深入,在编程中或多或少会涉及到 需要多线程的情况。多数时候,我们的操作模式是后台 线程中处理数据,计算结果,然后在前台界面(GUI) 中更新...

    .Net 多线程详解

    .doc 格式 详细解析多线程技术 基础篇 • 怎样创建一个线程 • 受托管的线程与 Windows线程 • 前台线程与后台线程 • 名为BeginXXX和EndXXX的方法是做什么用的 • 异步和多线程有什么关联 WinForm多线程编程...

    Java多线程与线程安全实践-基于Http协议的断点续传毕业设计—(包含完整源码可运行).rar

    Java多线程与线程安全实践-基于Http协议的断点续传毕业设计—(包含完整源码可运行).rar

    110104010104.rar_MFC多任务_MFC多线程挂起_mfc 多线程_mfc 生产者

    线程是程序独立运行的基本单位,一个程序通过执行多个线程可以提高机器本身资源的利用率,同时也可以完成多任务并行运行的操作,多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。 互斥体 互斥体与临界区...

    Delphi多线程教程

    Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchronize的用法就完了。然而这并不是多线程编...

    计算机网络安全课设-基于libpcap和winpcap的多线程网络包嗅探器

    内容概要:简洁的多线程网络包嗅探器 环境依赖: Python3 winpcap(if you are using Linux, please install libpcap) pcapy PyQt5 设计简介: 本次设计采用的编程语言为python。在Windows和Linux平台下先分别安装...

    android 网络应用轻量框架-多线程管理-高效缓存-设计模式

    6:使用状态模式 观察者模式更好的处理多线程 最初的想法:网络优化开发框架 (移除任务未完成) 网络稳定,系统运行稳定性,大内存消耗稳定,长时间运行稳定性 (旧的系统症结所在) 开启过多线程,导致系统...

    Java高级程序设计-多线程(二).pptx

    3.1 线程安全 多线程编程时,由于系统对线程的调度具有一定的随机性,所以,使用多个线程操作同一个数据时,容易出现线程安全问题。 当多个线程访问同一个资源时,如果控制不好,也会造成数据的不正确性。 以银行取...

    python3 多线程

    多线程学习,通过两个函数来测试多线程的运行原理,运行时可以反复看时间的先后

    JavaSE专题-多线程总结.doc

    多线程的常见问题总结分析 1、多线程技术介绍 2、主线程介绍 3、创建线程的方式 4、线程中的异常问题 5、线程运行状态 6、线程第二种创建方式 7、多线程练习 8、线程安全问题分析和解决 9、多线程细节 10、同步使用...

    线程安全双向链表源代码

    线程安全双向链表实现2次检验,中间包含3个线程,代码完善。可以vs与vc++运行,没有问题

    权威.NET多线程详解(源码示例)

    • 我的多线程WinForm程序老是抛出InvalidOperationException ,怎么解决? • Invoke,BeginInvoke干什么用的,内部是怎么实现的 • 每个线程都有消息队列吗? • 为什么Winform不允许跨线程修改UI线程控件的值 ...

    2022年JAVA毕业设计精品项目源码29期:基于JAVA的多线程与线程安全的Http协议断点续传.zip

    资源名:2022年JAVA毕业设计精品项目源码29期:基于JAVA的多线程与线程安全的Http协议断点续传.zip 资源类型:毕业设计项目源码+论文 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不能...

    C#多线程编程 四个显示线程计算结果的函数

    为使需要发生的封送处理量减到最少,并确保以线程安全方式处理调用, 应使用Control.BeginInvoke或Control.Invoke方法来调用主执行线程上的方法,从而使必须发生的跨线程边界的封送处理量减到最少。

    多线程操作窗口源码

    多线程是一种提高程序运行效率和性能的常用技术。 随着我们学习工作的深入,在编程中或多或少会涉及到 需要多线程的情况。多数时候,我们的操作模式是后台 线程中处理数据,计算结果,然后在前台界面(GUI) 中更新...

    多线程的简单描述

    java多线程简单的描述以及线程的安全、并发,同步机制

    Java多线程的初识与简单的安全问题解决

    多线程 目录 进程 进程的了解 线程 什么是线程 线程的组成 线程的创建 线程的状态 线程的方法 线程的安全问题 1.进程 1.1.进程的了解 简单的来说进程就是运行中的程序,简称为进程。 单核CPU在任意一个时间节点上,...

Global site tag (gtag.js) - Google Analytics