博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java多线程中同步的问题?
阅读量:4658 次
发布时间:2019-06-09

本文共 3722 字,大约阅读时间需要 12 分钟。

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

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();            }        }

 

转载于:https://www.cnblogs.com/ZXF6/p/11122734.html

你可能感兴趣的文章
hdu 1284
查看>>
atoi 函数
查看>>
SQLserver增删改操作
查看>>
在一些老的浏览器上启用 HTML5 的支持
查看>>
java虚拟机5 字节码
查看>>
Struts04---命名空间的查询顺序以及默认执行的Action
查看>>
关于Mapper、Reducer的个人总结(转)
查看>>
JS基础:this的指向以及call、apply的作用
查看>>
Linux下PS1、PS2、PS3、PS4使用详解
查看>>
“井号键”用英语怎么说?
查看>>
工作进展小结
查看>>
es6之后,真的不需要知道原型链了吗?
查看>>
笔记第四天
查看>>
rabbitmq学习-如何安装rabbitmq
查看>>
java 多线程 原子性
查看>>
Effective C++ 条款04
查看>>
STM32F407 串口通信:分类&常见接口 个人笔记
查看>>
qt 打包发布 获取dll
查看>>
辗转相除法、更相减损术(九章算术) 还是有点迷糊,
查看>>
Phone List
查看>>