线程02并发产生的安全问题

博客探讨了Java并发编程中的线程安全问题,通过模拟多人抢票场景展示了未加锁导致的数据紊乱。同时介绍了龟兔赛跑的小游戏,演示了多线程同步的问题。并提到了Lambda表达式在简化代码中的作用以及函数式接口的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程并发产生的安全问题

 * @PackageName:Threadtest
 * @ClassName:SafeThread
 * @Description:模拟多人抢票产生的线程安全问题
 * 问题描述:多个线程同时操作一个对象,举例火车票
 * 结果:数据紊乱,线程不安全,第一张票被同时抢了
 * @date 2021/8/10 19:20
 */

public class SafeThread implements Runnable{

    private int tickets=10;



    @Override
    public void run() {
        while (true) {
            if (tickets <= 0)
                break;
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"手速极快的抢到了第"
                    +tickets--+"票");
        }
    }

    public static void main(String[] args) {
        SafeThread safeThread = new SafeThread();

        new Thread(safeThread,"广东人").start();
        new Thread(safeThread,"上海人").start();
        new Thread(safeThread,"北京人").start();

    }


}

多人同时抢票,因为没有加锁,所以出现同一张票被多人抢或者抢一张不存在的票

运行结果(文字版)

北京人手速极快的抢到了第9票
广东人手速极快的抢到了第8票
上海人手速极快的抢到了第10票
广东人手速极快的抢到了第7票
北京人手速极快的抢到了第6票
上海人手速极快的抢到了第5票
上海人手速极快的抢到了第4票
广东人手速极快的抢到了第3票
北京人手速极快的抢到了第2票
广东人手速极快的抢到了第1票
上海人手速极快的抢到了第1票
北京人手速极快的抢到了第0票

`Process finished with exit code 0

龟兔赛跑小程序(多线程的熟悉练习)

* @PackageName:Threadtest
 * @ClassName:ThreadGame
 * @Description:龟兔赛跑小游戏,兔子每20步睡一次觉,2ms
 * @date 2021/8/10 19:42
 */

public class ThreadGame implements Runnable{
    private static String winner;

    @Override
    public void run() {
        for (int i = 1; i <= 1000; i++) {
            if (Thread.currentThread().getName().equals("兔子")&&i%20==0){
                try {
                    Thread.sleep(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            boolean flag =haswinner(i);
            if (flag) {
                break;
            }
            System.out.println(Thread.currentThread().getName()+"走了"+i+"步");
        }
    }

   public Boolean haswinner(int i){
        if (winner!=null){
            return true;
        }
        if (i>=1000 ){
            winner=Thread.currentThread().getName();
            System.out.println("比赛结束,胜利者是:"+winner);
            return true;
        }
        return false;
    }
    public static void main(String[] args) {
        ThreadGame threadGame = new ThreadGame();

        new Thread(threadGame,"兔子").start();
        new Thread(threadGame,"乌龟").start();
    }

}

乌龟走了998步
乌龟走了999步
兔子走了121步
比赛结束,胜利者是:乌龟

静态代理模式

总结:

真实对象和代理对象都要实现同一个接口

代理对象要代理真实角色

好处:

代理对象可以做很多真实对象做不了的事情

真实对象专注做自己的事情

Lamda表达式

好处:

避免匿名内部类定义过多

代码简洁

代码减负,留下核心代码

函数式接口

任何接口,如果只包含唯一一个抽象方法,那么它就是函数式接口

对于函数式接口,我们可以通过Lamda表达式来创建该接口的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值