首页 > 其他分享 >解决多线程中线程安全问题方式三

解决多线程中线程安全问题方式三

时间:2023-02-01 16:34:59浏览次数:45  
标签:Thread lock ReentrantLock 安全 num window2 new 中线 多线程

import java.util.concurrent.locks.ReentrantLock;

/**
* 解决多线程中线程安全问题方式三:调用Lock接口
1.因为Lock是接口,无法直接使用,所以使用Lock的实现类ReentrantLock
2.jdk5后新增的特性
3.lock需要手动调用lock()方法开启同步锁,当同步逻辑完成后,也需要手动调用unlock()方法来结束同步
*/
public class LockDemo {
    public static void main(String[] args) {
        //实现方式
        window1 w1 = new window1();
        Thread t1 = new Thread(w1);
        Thread t2 = new Thread(w1);
        Thread t3 = new Thread(w1);
        t1.setName("Implement窗口1");
        t2.setName("Implement窗口2");
        t3.setName("Implement窗口3");
        t1.start();
        t2.start();
        t3.start();

        //继承方式
//        window2 w = new window2();
//        window2 w2 = new window2();
//        window2 w3 = new window2();
//
//        w.setName("Extends窗口1");
//        w2.setName("Extends窗口2");
//        w3.setName("Extends窗口3");
//        w.start();
//        w2.start();
//        w3.start();


    }
}



/*实现方式*/
class window1 implements Runnable {

    private int num = 100;

    private ReentrantLock lock = new ReentrantLock();
//    private ReentrantLock lock = new ReentrantLock(true);  //代表公平锁,按照线程进入的先后顺序执行
    @Override
    public void run() {
        while(true){
            try {
                lock.lock();
                if(num > 0){
                    System.out.println(Thread.currentThread().getName() + "卖票,票号为:" + num);
                    num --;
                }else{
                    break;
                }
            }finally{
                lock.unlock();
            }

        }
    }
}

/*继承方式*/
class window2 extends Thread{
    private static int num = 100;
    private static ReentrantLock lock = new ReentrantLock();

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

 

标签:Thread,lock,ReentrantLock,安全,num,window2,new,中线,多线程
From: https://www.cnblogs.com/sjzchf/p/17083253.html

相关文章

  • 儿童围栏亚马逊要求标准ASTM F406安全测试
    亚马逊美国CPC认证儿童安全围栏ASTMF406检测标准CPC认证就是儿童产品安全证书(Children’sProductCertificate,CPC)适用于所有以12岁及以下儿童为主要目标使用对象的产品,......
  • Java多线程:Future和FutureTask
    一、FutureFuture是一个接口,所有方法如下:上源码:packagejava.util.concurrent;publicinterfaceFuture<V>{booleancancel(booleanmayInterruptIfRunning);......
  • 网络安全学习之信息收集-CDN绕过
    CDN相关概念 CDN利用全局负载均衡技术将用户的访问指向离用户最近的工作正常的流媒体服务器上,由流媒体服务器直接响应用户的请求。服务器中如果没有用户要访问的内容,会......
  • 多线程知识点
    1.理论产生死锁的四个条件互斥条件:一个资源同时只能被一个线程占用请求与保持条件:一个进程因请求资源而阻塞时,对已获得资源不释放不剥夺条件:一个进程已获得的资源,在不......
  • 使用Disruptor完成多线程下并发、等待、先后等操作
    Java完成多线程间的等待功能:场景1:一个线程等待其他多个线程都完成后,再进行下一步操作(如裁判员计分功能,需要等待所有运动员都跑完后,才去统计分数。裁判员和每个运动员都是一......
  • List 不安全
    packagepc;importjava.util.List;importjava.util.UUID;importjava.util.concurrent.CopyOnWriteArrayList;publicclassD{publicstaticvoidmain(String[]arg......
  • 理解Golang 赋值的并发安全性
     1.什么是并发安全并发安全就是程序在并发情况下执行的结果是正确的。比如对一个变量简单的自增操作count++,在非并发下很好理解,而在并发情况下却容易出现预期之外......
  • 代码实例解读如何安全发布对象
    摘要:在高并发环境下如何安全的发布对象实例。本文分享自华为云社区《【高并发】如何安全的发布对象(含各种单例代码分析)》,作者:冰河。今天,为大家带来一篇有技术含量的文章......
  • JavaScript 中更安全的 URL 读写
    前言URL对于我们开发人员来讲,应该是非常熟悉了。在对URL进行参数拼接时,我们一般都会直接进行字符串拼接或使用模版字符串,因为这样非常方便,但是我们这样其实会在不知不觉中......
  • SimpleDateFromat 是线程安全的吗
    1,在SimpleDateFormat转换日期是通过Calendar对象来操作的,SimpleDateFormat继承DateFormat类,DateFormat类中维护一个Calendar对象,通过DateFormat类中的注释可知:此处Calenda......