java多线程中同步的问题?
一、通过模拟网络延迟,解决同步的问题、
package com.zxf.demo; public class G01 implements Runnable{ private int num=10;
private int count=0;
@Override
public void run() {
// TODO Auto-generated method stub
while (true) { count++;
num--;
System.out.println(Thread.currentThread().getName()+"买到了第"+count+"条裤子,还剩"+num+"条裤子"); //模拟网络延迟 让进程睡眠一会 1秒
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} if (num<=0) {
break;
} } }
public static void main(String[] args) {
G01 g1 = new G01(); Thread t1 = new Thread(g1,"卢本伟");
Thread t2 = new Thread(g1,"马飞飞");
Thread t3 = new Thread(g1,"大司马");
Thread t4 = new Thread(g1,"骚男"); t1.start();
t2.start();
t3.start();
t4.start(); } }
这样写是有问题的 多个进程轮番执行,不能保证每个人买到的东西的唯一性
解决方式?
1.把可能产生的数据安全问题的代码 锁起来, 被锁定的代码就变成单线程的!
package com.zxf.demo; public class G01 implements Runnable{ private int num=10;
private int count=0;
@Override
public void run() {
// TODO Auto-generated method stub
while (true) { // 通过synchronized (this){} 将会出问题的部分 锁在这里 ,这里就变了单线程模式 就不会出错!
synchronized (this) {
if (num<=0) {
break;
}
count++;
num--;
System.out.println(Thread.currentThread().getName()+"买到了第"+count+"条裤子,还剩"+num+"条裤子");
} //模拟网络延迟 让进程睡眠一会 1秒
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }
public static void main(String[] args) {
G01 g1 = new G01(); Thread t1 = new Thread(g1,"卢本伟");
Thread t2 = new Thread(g1,"马飞飞");
Thread t3 = new Thread(g1,"大司马");
Thread t4 = new Thread(g1,"骚男"); t1.start();
t2.start();
t3.start();
t4.start(); } }
2.同步方法 就是在方法的返回值类型前边加上 synchronize将该方法内部的代码 全部锁起来
package com.zxf.demo; public class G01 implements Runnable{ private int num=10;
private int count=0;
@Override
public void run() {
// TODO Auto-generated method stub
while (true) { if (!buy()) { // 调用buy的方法 不满足结果 结束循环
break;
} //模拟网络延迟 让进程睡眠一会 1秒
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }
//同步方法 定义一个方法 需要在方法的返回值类型 前边加上 synchronized 关键字。
public synchronized boolean buy() { if (num<=0) {
return false;
}
num--;
count++;
System.out.println(Thread.currentThread().getName()+"买到了第"+count+"条裤子,还剩"+num+"条裤子"); return true; } public static void main(String[] args) {
G01 g1 = new G01(); Thread t1 = new Thread(g1,"卢本伟");
Thread t2 = new Thread(g1,"马飞飞");
Thread t3 = new Thread(g1,"大司马");
Thread t4 = new Thread(g1,"骚男"); t1.start();
t2.start();
t3.start();
t4.start(); } }
java多线程中同步的问题?的更多相关文章
- java多线程中并发集合和同步集合有哪些?区别是什么?
java多线程中并发集合和同步集合有哪些? hashmap 是非同步的,故在多线程中是线程不安全的,不过也可以使用 同步类来进行包装: 包装类Collections.synchronizedMap() ...
- Java多线程中的竞争条件、锁以及同步的概念
竞争条件 1.竞争条件: 在java多线程中,当两个或以上的线程对同一个数据进行操作的时候,可能会产生“竞争条件”的现象.这种现象产生的根本原因是因为多个线程在对同一个数据进行操作,此时对该数据的操作 ...
- Java多线程中易混淆的概念
概述 最近在看<ThinKing In Java>,看到多线程章节时觉得有一些概念比较容易混淆有必要总结一下,虽然都不是新的东西,不过还是蛮重要,很基本的,在开发或阅读源码中经常会遇到,在 ...
- java多线程中的三种特性
java多线程中的三种特性 原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并 ...
- java多线程中最佳的实践方案是什么?
java多线程中最佳的实践方案是什么? 给你的线程起个有意义的名字.这样可以方便找bug或追踪.OrderProcessor, QuoteProcessor or TradeProcessor 这种名 ...
- Java多线程的同步控制记录
Java多线程的同步控制记录 一.重入锁 重入锁完全可以代替 synchronized 关键字.在JDK 1.5 早期版本,重入锁的性能优于 synchronized.JDK 1.6 开始,对于 sy ...
- Java多线程中的常用方法
本文将带你讲诉Java多线程中的常用方法 Java多线程中的常用方法有如下几个 start,run,sleep,wait,notify,notifyAll,join,isAlive,current ...
- Java多线程之同步集合和并发集合
Java多线程之同步集合和并发集合 不管是同步集合还是并发集合他们都支持线程安全,他们之间主要的区别体现在性能和可扩展性,还有他们如何实现的线程安全. 同步集合类 Hashtable Vector 同 ...
- Java多线程编程(同步、死锁、生产消费者问题)
Java多线程编程(同步.死锁.生产消费): 关于线程同步以及死锁问题: 线程同步概念:是指若干个线程对象并行进行资源的访问时实现的资源处理保护操作: 线程死锁概念:是指两个线程都在等待对方先完成,造 ...
随机推荐
- hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速 ...
- 离线版centos8安装docker笔记
嗨嗨哈哈,已经很久没有坐下来胡编乱造一点笔记了,平时云服务器搞惯了,一个命令就安装好了docker了的,但这次生不逢时的新机房就没那么幸运了,有多不逢时超乎想象,不仅仅服务器没有外网,就连周围方圆一公 ...
- 【C++】指针初始化
1.Node * p:if(p)//报错 2.Node * p=NULL;if(p)//不报错 注意把指针初始化,否则指针将指向任意位置
- The Many Faces of Robustness: A Critical Analysis of Out-of-Distribution Generalization (DeepAugment)
目录 概 主要内容 ImageNet-R StreetView StoreFronts (SVSF) DeepFashion Remixed DeepAugment 实验结论 代码 Hendrycks ...
- [opencv]opencv主要组件介绍
[calib3d]--其实就是就是Calibration(校准)加3D这两个词的组合缩写.这个模块主要是相机校准和三维重建相关的内容.基本的多视角几何算法,单个立体摄像头标定,物体姿态估计,立体相似性 ...
- Ubuntu18.04编译Zircon
1.获取源代码 git clone https://fuchsia.googlesource.com/zircon 2.安装编译环境 sudo apt-get install texinfo libg ...
- win10 安装vue 详解-包括node.js、npm、webpack
1.下载 去官网下载 node.js https://nodejs.org/en/download/ 一般不会选择最新的,我安装的是 12.18.4 进入历史记录页面网址 https://nodejs ...
- nuxt2.0项目创建(最新)
使用import需要babel编译写法如下 //修改1打开package.json文件 "dev": "cross-env NODE_ENV=development n ...
- 【Azure 应用服务】一个 App Service 同时部署运行两个及多个 Java 应用程序(Jar包)
问题描述 如何在一个AppService下同时部署运行多个Java 应用程序呢? 问题解答 因为App Service的默认根目录为 wwwroot.如果需要运行多个Java 应用程序,需要在 www ...
- Could not find resource mybatis.xml 找不到mybatis主配置文件的三种解决方式
第一种:先清除target目录 再重新compile编译 第二种:让idea重构项目 第三种 :手动添加到target目录下的classes包下