java 多线程3(线程安全)
需求:模拟三个窗口同时买票。
问题1:static 修饰num,只创建一份在内存中,要不就会创建3份。
问题2:线程安全问题。(代码重1的红色字体)
出现的原因:存在两个或两个以上的线程对象,而且线程间共享着一个资源,
有多个语句操作了共享资源。
解决方式:加个锁,synchronized,把锁放到出现线程安全问题的地方,当多个线程一起
来访问时(线程1,线程2,线程3),看谁先强到锁,先抢到的“人”,拿到锁,
然后把门“锁上”,就执行它自己的,而其余的线程就在“门外”等,直到它出来了,
这时锁的状态就变成“开”,然后他们三个再继续一起“抢”,循环这一过程。
注意:公共的锁有且只有一把,多了就不能解决问题了。
那么么既然锁这么好用我们是不都要在自己代码中加个“锁”呢?
答:不是的,没有必要的时候是不用加的,否则会降低效率,如:判断锁的“开”和“关“,那也是要消耗时间的。
import java.util.Scanner;
public class EX10 {
public static void main(String[] args) {
SaleTicket t1 = new SaleTicket("chongkuo 1");
SaleTicket t2 = new SaleTicket("chongkuo 2");
SaleTicket t3 = new SaleTicket("chongkuo 3");
t1.start();
t2.start();
t3.start();
}
}
class SaleTicket extends Thread{
static int num = 50;
static Object o = new Object();
public SaleTicket(String name){
super(name);
}
@Override
public void run() {
while(true) {
synchronized ("锁"){
if(num > 0){
System.out.println(Thread.currentThread().getName() + "售出了第-------- " + num + "号票");
try{
Thread.sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
num--;
}else{
System.out.println("卖完了");
break;
}
}
}
}
}
java 多线程3(线程安全)的更多相关文章
- Java多线程之线程其他类
Java多线程之线程其他类 实际编码中除了前面讲到的常用的类之外,还有几个其他类也有可能用得到,这里来统一整理一下: 1,Callable接口和Future接口 JDK1.5以后提供了上面这2个接口, ...
- Java多线程之线程的通信
Java多线程之线程的通信 在总结多线程通信前先介绍一个概念:锁池.线程因为未拿到锁标记而发生的阻塞不同于前面五个基本状态中的阻塞,称为锁池.每个对象都有自己的锁池的空间,用于放置等待运行的线程.这些 ...
- Java多线程之线程的同步
Java多线程之线程的同步 实际开发中我们也经常提到说线程安全问题,那么什么是线程安全问题呢? 线程不安全就是说在多线程编程中出现了错误情况,由于系统的线程调度具有一定的随机性,当使用多个线程来访问同 ...
- Java多线程之线程的控制
Java多线程之线程的控制 线程中的7 种非常重要的状态: 初始New.可运行Runnable.运行Running.阻塞Blocked.锁池lock_pool.等待队列wait_pool.结束Dea ...
- Java多线程父子线程关系 多线程中篇(六)
有的时候对于Java多线程,我们会听到“父线程.子线程”的概念. 严格的说,Java中不存在实质上的父子关系 没有方法可以获取一个线程的父线程,也没有方法可以获取一个线程所有的子线程 子线程的消亡与父 ...
- 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)
Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...
- Java多线程02(线程安全、线程同步、等待唤醒机制)
Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...
- JAVA多线程之线程间的通信方式
(转发) 收藏 记 周日,北京的天阳光明媚,9月,北京的秋格外肃穆透彻,望望窗外的湛蓝的天,心似透过栏杆,沐浴在这透亮清澈的蓝天里,那朵朵白云如同一朵棉絮,心意畅想....思绪外扬, 鱼和熊掌不可兼得 ...
- java多线程与线程间通信
转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...
- java多线程之 ---- 线程死锁
java多线程之线程死锁 产生死锁的主要原因: 由于系统资源不足. 进程执行推进的顺序不合适. 资源分配不当等. 假设系统资源充足.进程的资源请求都可以得到满足,死锁出现的可能性就非常低.否则就会因争 ...
随机推荐
- afxmessagebox和messagebox
MessageBox()是Win32API函数.后者是mfc中的全局函数.在MFC中能用MessageBox()的地方都能用AfxMessageBox(). afxmessagebox更多的时候是用于 ...
- VC如何让窗口半透明
转载:http://blog.csdn.net/bichenggui/article/details/8291946 //加入WS_EX_LAYERED扩展属性 LONG styleValue = : ...
- 我的android学习经历17
tomcat的下载安装 1.下载tomcat 在百度中输入tomcat可以直接出现他的英文官网 http://tomcat.apache.org/ 进去以后选择与你的java版本相匹配的tomcat ...
- SQL Server建表和增删改
create database 数据库名 go --穿件完成 go create table 表名(列名 类型, 列名 类型, 列名 类型 --最后一个列名不加逗号) go --创建完成go 以创建表 ...
- Android 进度条改变图片透明度
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- sql 增加字段
ALTER TABLE [dt_article_goods] ADD [goods_id] int DEFAULT 0
- C++ 函数后加const
1.非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误)2.表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中, 任意修改它所在的类的成员的操作都是 ...
- [转]Unity 延迟执行一段代码的较为优雅的方式
Unity中,延时执行一段代码或者一个方法或者几个方法的情况非常普遍. 一般会用到Invoke和InvokeRepeating方法.顾名思义,第一个是执行一次,第二个是重复执行. 看下定义: void ...
- Phonegap项目中禁用WebViewBounce
UIWebView是iOS SDK中一个最常用的控件,在PhoneGap中,默认也是使用UIWebView作为默认视图显示我们的HTML应用的. 在使用PhoneGap的项目中,默认WebView ...
- Spring与其他Web框架集成
Spring与多种流行Web应用框架(Struts.JSF和DWR)集成的方法. Spring强大的IoC容器和企业支持特性使其十分适于实现Java EE应用的服务和持续层. 对于表现层,可以在许多不 ...