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

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】722. Remove Comments 解题报告(Python)

    [LeetCode]722. Remove Comments 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/remove-c ...

  2. 【Java例题】3.4求a+aa+aaa+aaaa+... ...+aa...a(n个

    4. package chapter3; import java.util.*; public class demo4 { public static void main(String[] args) ...

  3. element 表格只展开一行(点击下一行上一行关闭)

    源码:第一步 <el-table :data="tableData" border :row-class-name="tableRowClassName" ...

  4. UML 基本模型元素

    目录 1. 结构模型元素 (1)类(class) (2)接口(interface) (3)协作(collaboration) (4)用例(use case) (5)活动类(active class) ...

  5. Eclipse+Maven+JDK+tomcat搭建java的开发环境

    由于最近有几个同事都在学习java方面的东西,所以我写个博文做下笔记,其中遇到过很多个坑,这里就不多说了 首先,我用的是Eclipse+Maven的组合,用Ecplise是周边java开发的同事用这个 ...

  6. Docker下安装Nacos

    1:使用docker获取nacos服务镜像 docker pull nacos/nacos-server(不加版本号表示获取最新版本) 2:查看是否成功下载nacos镜像 docker images ...

  7. Git 如何放弃所有本地修改

    git checkout . #本地所有的修改,没有提交的,都返回到原来的状态 git stash #把所有没有提交的修改暂存到stash里面.可用git stash pop恢复. git reset ...

  8. Thrift框架-具体使用

    1.前言 使用thrift心得: (1)thrift是一个RPC的框架  ,RPC是远程过程调用协议:用于进行可扩展且跨语言的服务的开发,以构建在C++.Java.Python.PHP.Ruby.Er ...

  9. 微信小程序自定义导航栏组件

    1.首先,要在json文件中设置为自定义的形式 "navigationStyle": "custom" 2.计算相关值 导航栏分为状态栏和标题栏,只要能算出每台 ...

  10. Springboot整合Mybatis,连接多个数据库(Mysql+Oracle)

    maven依赖,需要注意的是mysql使用的版本 1 <dependencies> 2 <dependency> 3 <groupId>com.oracle.dat ...