美文网首页
Java多线程编程(2)线程安全与数据同步

Java多线程编程(2)线程安全与数据同步

作者: 景知育德 | 来源:发表于2022-12-11 17:43 被阅读0次

数据同步

数据不一致

在上一篇文章的例子中,我们让四台叫号窗口,叫号1~50,但是运行的时候,可能会出现各种各样的“bug”,包括

  • 某个号码被略过 没有出现
  • 某个号码重复出现
  • 叫号超过50

synchronized

我们可以用synchronized关键词,来简单的、朴素的避免上述情况。它提供一种互斥机制,在同一个时刻,只能有一个线程访问同步资源。

这类似于厕所里的小隔间,一次只能进去一个人,里面的人出来,别人才能够继续进去。

交错使用synchronized来上锁,可能会出现死锁的风险。对于一些开源库,调用层次比较深,可能不能直观地看出来有死锁的风险。例如JDK自带的HashMap,不是线程安全的类,如果在多线程同时写入的情况下,就可能会发生死锁。

如果想用线程安全的map数据结构,可以用ConcurrentHashMap或者Collections.synchronizedMap来代替。

package org.example;

public class Study7Synchronized {
    public static void main(String[] args) {
        int size = 4;
        String[] chineseNums = {"甲", "乙", "丙", "丁"};
        SynTicketWindowRunnable runnable = new SynTicketWindowRunnable();
        Thread[] threads = new Thread[size];
        for (int i = 0; i < size; i++) {
            threads[i] = new Thread(runnable, "窗口" + chineseNums[i]);
        }
        for (int i = 0; i < size; i++) {
            threads[i].start();
        }

        System.out.println("启动各柜台完毕!");
    }
}

/**
 * 改进之后,不再使用static的index
 */
class SynTicketWindowRunnable implements Runnable {
    private static final int MAX = 500;
    private int index = 1;
    private static final Object MUTEX = new Object();

    @Override
    public void run() {
        while (index <= MAX){
            synchronized (MUTEX) {
                if (index <= MAX)
                    System.out.println(Thread.currentThread().getName() + ":" + (index++));
            }
        }
    }
}

如以上代码,我们在涉及修改index的地方加上了 synchronized,从而实现了同步。

相关文章

  • Java多线程编程(2)线程安全与数据同步

    数据同步 数据不一致 在上一篇文章的例子中,我们让四台叫号窗口,叫号1~50,但是运行的时候,可能会出现各种各样的...

  • 线程安全之:同步锁

    一、线程安全 线程安全是多线程编程中的一个概念,在多线程的执行过程中访问修改某个共享数据时,线程安全的代码会在同步...

  • 5-线程(补充)

    Python多线程原理与实战 目的: (1)了解python线程执行原理 (2)掌握多线程编程与线程同步 (3)了...

  • 多线程

    Python多线程原理与实战 目的: (1)了解python线程执行原理 (2)掌握多线程编程与线程同步 (3)了...

  • 7.5java线程深度解析:线程的同步

    线程的同步是保证多线程安全访问竞争资源的一种手段。线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞...

  • 后端架构师技术图谱(三)-并发、锁、设计模式(二)

    并发 多线程 《40个Java多线程问题总结》 线程安全 《Java并发编程——线程安全及解决机制简介》 一致性、...

  • 多线程juc锁

    java_basic 1 线程安全 在Java多线程编程当中,实现线程安全: 内部锁(Synchronized...

  • 2018-05-24-多线程学习

    java多线程并发的编程学习 1,概念的学习 同步异步:同步需要等待异步不需要,同步如对共享数据操作避免脏数据...

  • Java 线程安全

    参考《深入了解Java虚拟机,JVM高级特性与最佳实践》 线程安全的实现方法 互斥同步: 指再多线程访问贡献数据...

  • Android中的多线程

    1. Java多线程基础 Java多线程,线程同步,线程通讯 2. Android常用线程 HandlerThre...

网友评论

      本文标题:Java多线程编程(2)线程安全与数据同步

      本文链接:https://www.haomeiwen.com/subject/rosaxdtx.html