package cn.sasa.demo2;

import java.util.concurrent.ExecutionException;

public class ThreadDemo {
public static void main(String[] args) throws InterruptedException, ExecutionException {
//创建Runnable接口实现类对象
Ticket t = new Ticket();
//创建3个Thread类对象,传递Runnable接口实现类
Thread t0 = new Thread(t);
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t); t0.start();
t1.start();
t2.start();
t3.start();
/**
* 线程安全问题一般发生在:
* 多线程并发访问同一个数据资源
*
* 通过线程休眠,出现了安全问题
*
* Thread-0 出售第 99
* Thread-1 出售第 98
* Thread-2 出售第 100
* Thread-3 出售第 97
* Thread-1 出售第 96
* Thread-0 出售第 96
* Thread-3 出售第 95
* Thread-2 出售第 94
* Thread-0 出售第 93
* Thread-1 出售第 92
* Thread-3 出售第 91
* Thread-2 出售第 91
* Thread-0 出售第 90
* Thread-1 出售第 90
* Thread-2 出售第 88
* Thread-3 出售第 89
* Thread-0 出售第 87
* Thread-1 出售第 87 ......
*
* 解决安全问题:
* 同步代码块
* synchronized(任意对象){
* 线程要操作的共享数据
* }
* 同步代码块中的锁对象可以是任意对象,
* 但多线程时,要使用同一个锁对象才能够保证线程安全性
*
* 同步方法 在方法声明上加入同步关键字
* eg :
* private synchronized void func(){
* ...
* }
* 同步方法中的对象锁,是本类对象引用 this
* 如果方法是静态的,锁是本类.class属性
*/ }
}
package cn.sasa.demo2;

public class Ticket implements Runnable {
//定义出售的票源
private int ticket = 100;
public static int sum = 100; public void run(){
int flag = 100;
while(flag > 0){
//buyTickets();
buy();
flag --;
}
} //同步方法 synchronized
private synchronized void buyTickets() {
if( ticket > 0){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" 出售第 "+ticket--);
}
} private static synchronized void buy() {
if( sum > 0){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" 还剩下。。。 "+sum--);
}
} }

最新文章

  1. [转]MVC整合Ajax
  2. 使用Jmeter录制脚本
  3. HTML5 语义元素
  4. oracle中replace、length、lengthb、substr、substrb函数
  5. people 0919
  6. C#利用POST实现杭电oj的AC自动机器人,AC率高达50%~~
  7. HDU1494(dp)
  8. 剖析touch事件在View中的传递
  9. 特殊的ip地址
  10. java对象引用-要掌握的细节
  11. [.Net Core] 简单使用 Mvc 内置的 Ioc(续)
  12. FastReport报表MVC显示步骤
  13. new delate he typedef的含义
  14. 吴恩达机器学习笔记30-神经网络的反向传播算法(Backpropagation Algorithm)
  15. Linux 磁盘分区,文件系统创建、挂载、开机自动挂载和卸载
  16. ie 浏览器缓存问题
  17. vuejs 1.x与2.x差异
  18. VS2012打开项目——已停止工作
  19. Termux 详细安装
  20. DRBD架构详解(原创)

热门文章

  1. TI am335x am437x PRU
  2. android开发(47) 使用xml drawable 实现 局部圆角,可用作圆角边框
  3. Linux下MySQL5.7.18二进制包安装(无默认配置文件my_default.cnf)
  4. 阿里云中ssl配置(nginx安装https服务)
  5. Kubernetes部署SpringCloud(一) Eureka 集群,解决unavailable-replicas,available-replicas条件
  6. 【class2src】Decompiler
  7. ORA-03135 防火墙超时设置断开db link 连接
  8. git 删除仓库的文件
  9. 9.25中间件和Django的学过的知识总结
  10. 180714、JRebel插件安装配置与破解激活(多方案)详细教程