多线程带来的数据不一致

简介:

解决:两种方法
1同步快

import java.util.Random;


public class Test13 {

    /**
     * @param args
     * 多线程带来的数据不一致  
     * 解决办法  同步机制   1 同步块    2 同步方法(不推荐)
     */
    public static void main(String[] args) {
        ShellTickOp sto=new ShellTickOp(30);
        Thread counter1=new Thread(sto,"张三 ");
        Thread counter2=new Thread(sto,"李四");
        Thread counter3=new Thread(sto,"王五");
        counter1.start();
        counter2.start();
        counter3.start();



    }

}

class ShellTickOp implements Runnable{
    int tickets;
    Random r=new Random();

    public ShellTickOp(int tickets){

        this.tickets=tickets;
    }

    @Override
    public void run() {
//      while(true){
//          
//          if(tickets>0){
//              
//              try {
//                  Thread.sleep(800);
//                  System.out.println(Thread.currentThread().getName()+"在shell第"+(tickets--)+"张票");
//              } catch (InterruptedException e) {
//                  e.printStackTrace();
//              }
//              
//          }else {
//              return;
//          }
//          

这里输出到负数了   0   -1  -2//      }
        // 解决办法     加入同步块
            while(true){
                synchronized(this){  // 参数是一个对象 任何对象都行  一般用当前对象  用来做对象锁 一个线程进来后就 锁上
                    if(tickets>0){

                        try {
                            Thread.sleep(800);
                            System.out.println(Thread.currentThread().getName()+"在shell第"+(tickets--)+"张票");
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                    }else {
                        return;
                }
                }
        }

    }
}

2.同步方法
一般不用 因为用了线程就没有意义了

目录
相关文章
|
5月前
|
存储 前端开发 Java
【C++ 多线程 】C++并发编程:精细控制数据打印顺序的策略
【C++ 多线程 】C++并发编程:精细控制数据打印顺序的策略
154 1
|
5月前
|
存储 Java 数据安全/隐私保护
【JUC】ThreadLocal 如何实现数据的线程隔离?
【1月更文挑战第15天】【JUC】ThreadLocal 如何实现数据的线程隔离?ThreadLocal 导致内存泄漏问题?
|
23天前
|
消息中间件 监控 安全
服务Down机了,线程池中的数据如何保证不丢失?
在分布式系统与高并发应用开发中,服务的稳定性和数据的持久性是两个至关重要的考量点。当服务遭遇Down机时,如何确保线程池中处理的数据不丢失,是每一位开发者都需要深入思考的问题。以下,我将从几个关键方面分享如何在这种情况下保障数据的安全与完整性。
41 2
|
5月前
|
消息中间件 Java Kafka
实时计算 Flink版操作报错之Apache Flink中的SplitFetcher线程在读取数据时遇到了未预期的情况,该怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
1月前
|
消息中间件 存储 Java
服务重启了,如何保证线程池中的数据不丢失?
【8月更文挑战第30天】为确保服务重启时线程池数据不丢失,可采用数据持久化(如数据库或文件存储)、使用可靠的任务队列(如消息队列或分布式任务队列系统)、状态监测与恢复机制,以及分布式锁等方式。这些方法能有效提高系统稳定性和可靠性,需根据具体需求选择合适方案并进行测试优化。
|
2月前
处理串口线程数据的函数
【8月更文挑战第4天】处理串口线程数据的函数。
24 4
|
2月前
|
数据处理 Python
解锁Python多线程编程魔法,告别漫长等待!让数据下载如飞,感受科技带来的速度与激情!
【8月更文挑战第22天】Python以简洁的语法和强大的库支持在多个领域大放异彩。尽管存在全局解释器锁(GIL),Python仍提供多线程支持,尤其适用于I/O密集型任务。通过一个多线程下载数据的例子,展示了如何使用`threading`模块创建多线程程序,并与单线程版本进行了性能对比。实验表明,多线程能显著减少总等待时间,但在CPU密集型任务上GIL可能会限制其性能提升。此案例帮助理解Python多线程的优势及其适用场景。
29 0
|
2月前
|
NoSQL Redis
Lettuce的特性和内部实现问题之在同步调用模式下,业务线程是如何拿到结果数据的
Lettuce的特性和内部实现问题之在同步调用模式下,业务线程是如何拿到结果数据的
|
4月前
|
存储 测试技术
【工作实践(多线程)】十个线程任务生成720w测试数据对系统进行性能测试
【工作实践(多线程)】十个线程任务生成720w测试数据对系统进行性能测试
47 0
【工作实践(多线程)】十个线程任务生成720w测试数据对系统进行性能测试
|
3月前
|
存储 缓存 NoSQL
架构设计篇问题之在数据割接过程中,多线程处理会导致数据错乱和重复问题如何解决
架构设计篇问题之在数据割接过程中,多线程处理会导致数据错乱和重复问题如何解决