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

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. 【LeetCode】306. Additive Number 解题报告(Python)

    [LeetCode]306. Additive Number 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http: ...

  2. Entropy, relative entropy and mutual information

    目录 Entropy Joint Entropy Conditional Entropy Chain rule Mutual Information Relative Entropy Chain Ru ...

  3. Spring企业级程序设计 • 【第1章 Spring之旅】

    全部章节   >>>> 本章目录 1.1 Spring框架基础 1.1.1 Spring特点及体系结构 1.1.1 Spring的体系结构 1.1.2  使用Eclipse搭建 ...

  4. MySQL数据库基础(3)DDL和DML

    一.使用DDL定义数据库和表结构 结构化查询语言:(Structured Query Language,SQL)是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,专用于存取数据以及查询.更新和 ...

  5. DOTween实现缓动变值动效

    DOTween.To(getter, setter, to, float duration) 是常用的一个变值方法(一定时间将某变量从起始值到终点值进行变化),可以便捷实现 滚分.涨进度条 等功能 但 ...

  6. Python_闭包

    闭包并不只是一个python中的概念,在函数式编程语言中应用较为广泛.理解python中的闭包一方面是能够正确的使用闭包,另一方面可以好好体会和思考闭包的设计思想. 1.概念介绍 首先看一下维基上对闭 ...

  7. next中layout

    layout是页面模板,主要是为了做到无论在任何页面都会显示的内容,例如头部header,或者nav导航,页脚等固定页面.nuxt配置以及layout具体参考(https://cloud.tencen ...

  8. 编写Hive的UDF(查询平台数据同时向mysql添加数据)

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6812629187518530052/ 可能会有一些截图中会有错误提示,是因为本地的包一直包下载有问题,截完图已经下 ...

  9. Mybatis-Plus的引用

    一.依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-b ...

  10. 异常 finally

    经典面试题:  程序执行结果是100: (一):final和finally和finalize的区别