我们讲到多线程,就离不开并发,讲到并发,就离不开安全性,这里我们先来实现一个简单功能能:买票系统
这是票的类,以及买票的方法:
public class DBTicket { // 假设存放100张票 private static int num = 100; public static void setNum(int num) { DBTicket.num = num; } // 这是一个买票的方法 public static int getTicket(){ if(num < 1){ return 0; } return num --; } }
这是一个线程,模拟一个卖票窗口:
public class Thread1 implements Runnable { @Override public void run() { // 打印哪个窗口(线程),买到哪张票 System.out.println(Thread.currentThread() +":"+DBTicket.getTicket()); } }
模拟买票:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Test { public static void main(String[] args) throws Exception { ExecutorService ex = Executors.newFixedThreadPool(10); // 通过线程池, 模拟有3个窗口(线程),当然你可以建立不同的Thread 1 2 3 // 多执行几次 for(int i = 0;i<3;i++){ ex.execute(new Thread1()); ex.execute(new Thread1()); ex.execute(new Thread1()); } ex.shutdown(); } }
当你多执行几次的时候发现,会有重复的数字,不同的创窗口(线程),买到同样的票!你显然不不允许的。
OK,这是时候 很多人会说,加上关键字,synchronized ,就行了。是的,加上了 目前是安全的。
public static synchronized int getTicket(){ if(num < 1){ return 0; } return num --; }
提示:这里加上 Thread.sleep(100) 模拟买票需要时间,效果更明显。
这里可以用java.util.concurrent.* 下面的 ReentrantLock 进行锁定;比如:
private void lookStatus(){ try{ lock.lock(); int num = getNum(); // 打印哪个窗口(线程),买到哪张票 System.out.println(Thread.currentThread() +":"+num); } catch (InterruptedException e) { e.printStackTrace(); }finally{ lock.unlock(); } }
这里记得关闭 ,unlock 方法。不然会持有锁,不放的。具体请看API 或者源码,此类更更灵活。
发现内容比较多。还是整理一下,单独说线程的类吧
相关推荐
在Java多线程高并发编程中,重入锁(ReentrantLock)是一个至关重要的概念,它提供了比Java内置锁(synchronized)更细粒度的控制,并且具有更高的可读性和可扩展性。本篇文章将深入探讨重入锁的相关知识点。 首先...
多线程并发编程-同步与互斥-原子变量-并发和无锁数据结构 多线程并发编程是提高认程序性能的核心技术,但它也增加了编程的复杂性。因此,系统理解和掌握多线程并发编程的技巧变得尤为重要。本章将从多线程编程的...
在这个名为"人工智能-项目实践-多线程-多线程与高并发.zip"的压缩包中,我们可以推测它可能包含了关于如何在AI项目中应用多线程技术以实现高效并发处理的资源,比如代码示例、教程或者研究报告。 多线程是指在一个...
在本项目实践中,我们将深入探讨Java中的多线程与高并发技术,特别是在人工智能领域的应用。Java作为一种广泛应用的编程语言,其强大的并发处理能力是其在大规模数据处理和高性能计算场景中备受青睐的原因之一。本...
在处理大量图像或需要快速响应时间的应用场景中,多线程并发识别可以显著提升效率。以下将详细介绍如何利用Tesseract OCR实现多线程并发识别,以及可能涉及的相关技术点。 首先,理解Tesseract OCR的基本工作原理是...
一种典型的多线程并发服务器架构如下: - **主监听线程**:负责接收客户端连接请求。 - **工作线程池**:由多个工作线程组成,负责处理具体的客户端请求。 **3. 示例代码片段** 下面是一个简单的多线程服务器示例...
在“多线程-day02”的学习资源中,我们深入探讨了Java内存模型以及多线程的特性与控制机制。 **Java内存模型** Java内存模型,也称为JVM内存模型,是Java程序员理解和掌握的基础知识,特别是在进行并发编程时。它...
Java 多线程之并发锁 Java 中的多线程编程是指在一个程序中同时运行多个线程,以提高程序的执行效率和响应速度。在多线程编程中,线程间的同步是非常重要的,因为不同的线程可能会同时访问同一个共享资源,导致数据...
这里,我们主要探讨的是如何通过编写多线程并发程序来优化应用程序的性能,提高系统的处理能力。 首先,多线程是指在一个进程中同时执行多个线程。线程是操作系统调度的基本单位,它允许程序同时执行多个任务。多...
在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是...
在本教程中,我们将探讨多线程的基础知识,包括并发与并行的区别,进程与线程的概念,以及如何在 Java 中创建和管理线程。 并发与并行是两个经常混淆的概念。并发指的是多个任务在一段时间内交替执行,它们可能在...
线程的状态管理是多线程编程中非常重要的部分。Java线程有六种状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED。NEW表示线程刚创建还未启动,RUNNABLE表示线程在执行或等待CPU资源,BLOCKED表示...
标题"WEBAPI多线程并发测试工具"指出,这是一个专门针对Web API进行多线程并发测试的工具。Web API通常指的是应用程序接口,它们允许不同的服务之间进行通信,以实现数据交换和功能整合。多线程并发测试则是验证在多...
在现代软件开发中,多线程并发技术是提高程序性能和响应速度的关键因素之一。随着计算机硬件的性能持续提升,程序也必须能够有效地利用多核处理器来实现真正的并行处理。JVM(Java虚拟机)作为Java应用程序的运行...
多线程与高并发是计算机科学中非常重要的两个概念,它们在提高软件程序的性能、响应速度和资源利用率方面起着至关重要的作用。在当今的互联网时代,特别是在产业互联网和5G技术的推动下,多线程和高并发的应用变得...
本文通过三行代码展示了如何使用读写锁解决多线程并发写入文件的冲突。 读写锁的核心在于,它允许多个线程同时读取资源,但只允许一个线程写入资源。这样,当多个线程尝试写入时,只有一个线程能够获得写锁,其他...
Java多线程与并发编程是Java语言中用于处理多任务执行的关键技术,它能够帮助开发者设计出能够有效应对高并发请求的应用程序。在现代的线上(Online)和离线(Offline)应用中,合理利用多线程技术可以大幅提高系统...
CyclicBarrier(循环屏障)和CountDownLatch(计数器门锁)用于多线程间的协作,以及Lock接口及其实现如ReentrantLock提供了比synchronized更细粒度的锁控制。 总之,Java模拟线程并发是一个广泛且深入的话题,涵盖...
在Java多线程并发编程中,ReentrantReadWriteLock(可重入读写锁)是一个重要的同步工具,它属于Java并发包(java.util.concurrent.locks)中的一个类。这个锁提供了比标准的synchronized关键字更细粒度的控制,允许...
在IT行业中,多线程是提高程序性能和并发能力的重要技术。在本课程"day24-多线程-设计模式"中,我们将深入探讨如何利用多线程结合设计模式来优化程序执行效率。首先,我们要理解的是,多线程是指在一个进程中同时...