java 线程(四)线程安全 同步方法
2024-09-18 05:06:31
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--);
}
} }
最新文章
- [转]MVC整合Ajax
- 使用Jmeter录制脚本
- HTML5 语义元素
- oracle中replace、length、lengthb、substr、substrb函数
- people 0919
- C#利用POST实现杭电oj的AC自动机器人,AC率高达50%~~
- HDU1494(dp)
- 剖析touch事件在View中的传递
- 特殊的ip地址
- java对象引用-要掌握的细节
- [.Net Core] 简单使用 Mvc 内置的 Ioc(续)
- FastReport报表MVC显示步骤
- new delate he typedef的含义
- 吴恩达机器学习笔记30-神经网络的反向传播算法(Backpropagation Algorithm)
- Linux 磁盘分区,文件系统创建、挂载、开机自动挂载和卸载
- ie 浏览器缓存问题
- vuejs 1.x与2.x差异
- VS2012打开项目——已停止工作
- Termux 详细安装
- DRBD架构详解(原创)
热门文章
- TI am335x am437x PRU
- android开发(47) 使用xml drawable 实现 局部圆角,可用作圆角边框
- Linux下MySQL5.7.18二进制包安装(无默认配置文件my_default.cnf)
- 阿里云中ssl配置(nginx安装https服务)
- Kubernetes部署SpringCloud(一) Eureka 集群,解决unavailable-replicas,available-replicas条件
- 【class2src】Decompiler
- ORA-03135 防火墙超时设置断开db link 连接
- git 删除仓库的文件
- 9.25中间件和Django的学过的知识总结
- 180714、JRebel插件安装配置与破解激活(多方案)详细教程