一、通过模拟网络延迟,解决同步的问题、

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多线程中同步的问题?的更多相关文章

  1. java多线程中并发集合和同步集合有哪些?区别是什么?

    java多线程中并发集合和同步集合有哪些? hashmap 是非同步的,故在多线程中是线程不安全的,不过也可以使用 同步类来进行包装: 包装类Collections.synchronizedMap() ...

  2. Java多线程中的竞争条件、锁以及同步的概念

    竞争条件 1.竞争条件: 在java多线程中,当两个或以上的线程对同一个数据进行操作的时候,可能会产生“竞争条件”的现象.这种现象产生的根本原因是因为多个线程在对同一个数据进行操作,此时对该数据的操作 ...

  3. Java多线程中易混淆的概念

    概述 最近在看<ThinKing In Java>,看到多线程章节时觉得有一些概念比较容易混淆有必要总结一下,虽然都不是新的东西,不过还是蛮重要,很基本的,在开发或阅读源码中经常会遇到,在 ...

  4. java多线程中的三种特性

    java多线程中的三种特性 原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并 ...

  5. java多线程中最佳的实践方案是什么?

    java多线程中最佳的实践方案是什么? 给你的线程起个有意义的名字.这样可以方便找bug或追踪.OrderProcessor, QuoteProcessor or TradeProcessor 这种名 ...

  6. Java多线程的同步控制记录

    Java多线程的同步控制记录 一.重入锁 重入锁完全可以代替 synchronized 关键字.在JDK 1.5 早期版本,重入锁的性能优于 synchronized.JDK 1.6 开始,对于 sy ...

  7. Java多线程中的常用方法

    本文将带你讲诉Java多线程中的常用方法   Java多线程中的常用方法有如下几个 start,run,sleep,wait,notify,notifyAll,join,isAlive,current ...

  8. Java多线程之同步集合和并发集合

    Java多线程之同步集合和并发集合 不管是同步集合还是并发集合他们都支持线程安全,他们之间主要的区别体现在性能和可扩展性,还有他们如何实现的线程安全. 同步集合类 Hashtable Vector 同 ...

  9. Java多线程编程(同步、死锁、生产消费者问题)

    Java多线程编程(同步.死锁.生产消费): 关于线程同步以及死锁问题: 线程同步概念:是指若干个线程对象并行进行资源的访问时实现的资源处理保护操作: 线程死锁概念:是指两个线程都在等待对方先完成,造 ...

随机推荐

  1. 本原串(hdu 2197)

    本原串 题目链接 思路: 反向想将总的个数减去不符合要求的个数.我们枚举n的约数,然后把n平均分,就可以构成不符合要求的串,\(g[i]\)表示循环节长为i约数的个数\(2^i\),我们要求循环节为\ ...

  2. 1054 - Efficient Pseudo Code

    1054 - Efficient Pseudo Code    PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: ...

  3. wordpress中遇到的问题

    在博客园申请了账号,也已经开始写了两篇内容,但还是想要有属于自己的小站.于是将域名续费了几年,又在我之前买的vps上搭建了一个wordpress博客站点,这样以后我就可以同时发布到两个地方. 根据教程 ...

  4. vue打包之后动态修改请求接口方法

    1.可以根据自身情况封装获取配置文件接口信息 1.1我在static中新建一个config.json配置文件 { "DEV_URL":"/apis",//开发模 ...

  5. 使用 DML语句针对仓库管理信息系统,进行查询操作

    查看本章节 查看作业目录 需求说明: 查询所有电视机产品的基本信息,要求显示产品编号.产品名和进货单价 查询所有产品的基本信息,要求按类型升序.价格降序显示查询信息 显示所有不重复的产品类型 显示进货 ...

  6. Java练习习题,百钱买百鸡问题,用100文钱买鸡,公鸡5文钱一只,母鸡3文钱一只,小鸡3只1文钱

    需求说明: 用100文钱买鸡,公鸡5文钱一只,母鸡3文钱一只,小鸡3只1文钱,要求公鸡.母鸡.小鸡都必须要有,刚好用完100文钱,公鸡.母鸡.小鸡的数量之和也是100. public class te ...

  7. 如何跳出springboot的service层中某一个方法?

    有一个需求,就是中断某个方法中的for循环 目前的做法是:for循环中,增加if判断,如果满足条件就return,会中断这个方法 for (int i = 0; i < totalIndex; ...

  8. MATLAB 右键该文件不存在或者SIMULINK打开后仿真器件报错

    错误示例: 提示是否创建文件 并且会提示某某模块或者某某文件未找到not found 原因: .m文件不存在,是因为所打开的文件还并没有添加进matlab的搜索目录,或者是需要.m文件运行后生成的 某 ...

  9. 《手把手教你》系列技巧篇(五十四)-java+ selenium自动化测试-上传文件-中篇(详细教程)

    1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等.所以宏哥打算按上传文件的分类对其进行一下讲解和分享. 2.为什么selenium没有提供 ...

  10. 初识python: xlsxwriter 将数据写入Excel

    使用 xlsxwriter 模块将数据写入excel . #!/user/bin env python # author:Simple-Sir # time:2020/9/24 12:51 # 使用 ...