首页 > 其他分享 >lock解决线程安全问题,与synchronize区别,同步的三种方式

lock解决线程安全问题,与synchronize区别,同步的三种方式

时间:2023-08-23 23:55:29浏览次数:37  
标签:同步 Thread lock synchronize 线程 new ticket windowRun

package com.atjava.test;

import java.util.concurrent.locks.ReentrantLock;

class Window1 implements Runnable{

    private int ticket = 100;
    private ReentrantLock lock = new ReentrantLock();

    @Override
    public void run() {
        while (true){
            try {
                lock.lock();
                if(ticket > 0){
                    System.out.println(Thread.currentThread().getName() + "售票,票号为:" + ticket);
                    ticket--;
                }else {
                    break;
                }
            } finally {
                lock.unlock();
            }
        }
    }
}

public class LockTest {
    public static void main(String[] args) {
        Window1 windowRun = new Window1();
        Thread thread1 = new Thread(windowRun);
        Thread thread2 = new Thread(windowRun);
        Thread thread3 = new Thread(windowRun);
        thread1.setName("窗口一");
        thread2.setName("窗口二");
        thread3.setName("窗口三");
        thread1.start();
        thread2.start();
        thread3.start();
    }
}

  synchronize执行完同步代码就自动释放锁了,而lock需要手动的释放锁

 

 

同步的三种方式:同步方法,同步代码块,lock

标签:同步,Thread,lock,synchronize,线程,new,ticket,windowRun
From: https://www.cnblogs.com/sgj191024/p/17653074.html

相关文章

  • 进程、线程、协程
    进程内可开启多个线程,线程内可开启多个协程进程、线程可以利用cpu多核来并行,协程是切换成本低,不是并行。 ......
  • 【操作系统】2.进程和线程
    1.操作系统的多进程图像操作系统main函数中最后if(!fork()){init();},也就是main函数最后创建了第1个进程,init执行了shell(Windows)桌面。操作系统管理和组织进程都使用PCB(ProcessControlBlock),不同的程序的PCB放在不同的位置,用于记录该进程运行时的状态。操作系统对进程......
  • 记录--为什么要使用 package-lock.json?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前言随着JavaScript在现代软件开发中的日益重要地位,Node.js生态系统中的npm成为了不可或缺的工具。在npm管理依赖的过程中,package-lock.json文件的作用日益凸显。本文将深入探讨为什么要使用package-lock.json,以及......
  • 什么是多线程,多线程的优劣?
    多线程:多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务。多线程的好处:可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。也就是说允许单个程序创建多个......
  • java中创建线程的三种方法以及区别
    java中创建线程的三种方法以及区别 Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用三种方式来创建线程,如下所示:1)继承Thread类创建线程2)实现Runnable接口创建线程3)使用Callable和Future创建线程下面让我们分别来看看这三种创建线程的......
  • 线程池
    参考文档https://www.toutiao.com/i6820216970252648971/?timestamp=1611647531&app=news_article_lite&use_new_style=1&req_id=2021012615521001013003701233060951&share_token=d49da611-6e37-46ae-90ea-9a51d6e3ad7b&group_id=6820216970252648971ht......
  • 线程状态
    1)新建当用new关键字创建一个线程时,还没调用start就是新建状态。2)就绪调用了start方法之后,线程就进入了就绪阶段。此时,线程不会立即执行run方法,需要等待获取CPU资源。start()方法的作用是:启动一个分支线程,在JVM中开辟一个新的栈空间3)运行当线程获得CPU时间片后,就会进入......
  • CF1335E1 Three Blocks Palindrome (easy version)
    思路发现一个进阶回文序列仅包含三个部分:\(x\)个连续的\(a\),\(y\)个连续的\(b\),\(x\)个连续的\(a\)。对于一个\(a\),我们一定会取最外面的两个\(a\),如果不取,则答案一定不小或不变,所以我们枚举到\(a\)的时候,一定是确定了最外围的两个\(a\)的位置。接下来再枚举\(x\)......
  • java多线程使用详解与案例,超详细
    一、创建线程的方式1、继承Thread类让子类继承Thread线程类子类必须重写Thread类的run方法创建一个自己定义的线程对象调用start()方法启动线程//测试类/***1、让子类继承Thread线程类*/publicclassThreadTest1extendsThread{//2、子类必须重写Thread类......
  • Java 多线程处理 for 循环数据
    对于必须在for循环内进行查询的场景,可采用以下几种方式进行优化。1、主线程与子线程无先后顺序publicstaticvoidmain(String[]args)throwsInterruptedException{for(inti=0;i<5;i++){ThreadUtil.execAsync(()->{......