不用Synchronized关键词会出现的问题

简介: 结果:多个线程共享ticket变量,会导致ticket的值变为-1甚至-2才停下来,而不是为0才停。原因:没上锁,可能三个线程同时走进if分支。

多线程会出现的问题


1)请你看看以下的代码有什么问题?

public class Sell extends Thread{
    private static int ticket=100;
    @Override
    public void run(){
        while(true){
            if(ticket<=0)
            System.out.println("停止卖");
            break;
        }
    Thread.sleep(1000);
    System.out.println("窗口"+Thread.currentThread().getName()+
                            "售出一个,剩余票数还有"+(--ticket));
    }
}


Sell sell1=new Sell();
Sell sell2=new Sell();
Sell sell3=new Sell();
sell1.start();//启动三个线程
sell2.start();
sell3.start();


结果:多个线程共享ticket变量,会导致ticket的值变为-1甚至-2才停下来,而不是为0才停。

原因:没上锁,可能三个线程同时走进if分支。



2)请你看看以下的代码有什么问题?

public class Sell02 implements Runnable{
    private int ticket=100;
    @Override
    public void run(){
        while(true){
            if(ticket<=0)
            System.out.println("停止卖");
            break;
        }
    Thread.sleep(1000);
    System.out.println("窗口"+Thread.currentThread().getName()+
                            "售出一个,剩余票数还有"+(--ticket));
    }
}


与1)的不同点:

1.继承类改为了实现接口

2.取消了static

此时把同个对象放到了不同线程。

Sell02 sell1=new Sell02();
new Thread(sell1).start();//启动三个线程
new Thread(sell1).start();
new Thread(sell1).start();


结果:还是会有负数现象。


原因:同1)。



那么此时怎么解决这个多线程的问题?


线程同步技术Synchronized加在代码块中即可。

目录
相关文章
|
6月前
|
存储 安全 Java
Synchronized 优化
Synchronized 优化
|
2月前
|
存储 安全 Java
Java并发编程之深入理解Synchronized关键字
在Java的并发编程领域,synchronized关键字扮演着守护者的角色。它确保了多个线程访问共享资源时的同步性和安全性。本文将通过浅显易懂的语言和实例,带你一步步了解synchronized的神秘面纱,从基本使用到底层原理,再到它的优化技巧,让你在编写高效安全的多线程代码时更加得心应手。
|
3月前
|
Java 程序员 开发者
Java并发编程之深入理解synchronized关键字
本文旨在探究Java语言中一个核心且经常被误解的并发控制工具——synchronized关键字。通过分析其内部机制、使用场景和性能考量,我们将揭示这个简单关键字背后隐藏的强大功能和潜在陷阱。文章将引导你重新认识synchronized,并学会如何在实际开发中高效利用它来构建健壮的多线程应用程序。
|
6月前
|
安全 Java 编译器
Java多线程基础-6:线程安全问题及解决措施,synchronized关键字与volatile关键字(一)
线程安全问题是多线程编程中最典型的一类问题之一。如果多线程环境下代码运行的结果是符合我们预期的,即该结果正是在单线程环境中应该出现的结果,则说这个程序是线程安全的。 通俗来说,线程不安全指的就是某一代码在多线程环境下执行会出现bug,而在单线程环境下执行就不会。线程安全问题本质上是由于线程之间的调度顺序的不确定性,正是这样的不确定性,给我们的代码带来了很多“变数”。 本文将对Java多线程编程中,线程安全问题展开详细的讲解。
96 0
|
6月前
|
Java
Java并发编程:深入理解Synchronized关键字
【5月更文挑战第27天】Java并发编程是Java开发中不可或缺的一部分,而synchronized关键字则是实现并发控制的重要手段之一。本文将深入探讨synchronized关键字的使用方法、原理以及注意事项,帮助读者更好地理解和应用这一关键字,提高Java并发编程的能力。
|
Java 编译器
volatile关键词在多线程中的应用
volatile关键词在多线程中的应用
53 0
volatile关键词在多线程中的应用
|
Java
synchronized 关键字对于锁的一些优化
synchronized 关键字对于锁的一些优化
63 0
|
安全 Java
【并发多线程】java并发中的Synchronized关键词
【并发多线程】java并发中的Synchronized关键词
89 0
|
存储 安全 Java
深入解析 synchronized 关键字
最近看了几篇 synchronized 关键字的相关文章,收获很大,想着总结一下该关键字的相关内容。
深入解析 synchronized 关键字
|
Java
Java多线程之synchronized关键词(Demo详解)
你好我是辰兮,很高兴你能来阅读,本篇文章为大家讲解Java多线程之synchronized关键词,下面有案例的截图和相关代码可以自行实践,相关的更多面试知识已经提前整理好文章可以阅读学习,分享获取新知,希望对Java初学者有帮助。
151 0
Java多线程之synchronized关键词(Demo详解)