首页 > 编程语言 >java 线程同步

java 线程同步

时间:2023-03-04 15:33:35浏览次数:36  
标签:同步 java void getTicket 线程 test public

多种方式可以完成线程同步,传统方法是关键字 synchronized 完成的,可以是同步方法也可以是同步代码块

同步方法

@Data
@AllArgsConstructor
@NoArgsConstructor
class MyTheard4 implements Runnable{
    private int ticket;
    @Override
    public void run() {
        // test 方法是同步方法, 一次只能一个线程进入. 但是循环会有多个线程同时进入
        while (this.getTicket() > 0){
            test();
        }
    }
    // 同步方法
    public synchronized void test(){
        // 1, 当剩余 1 张票的时候, 还是会有多个线程进入循环, 都等在同步方法外面
        // 2, 这里再次判断就不会出现 0 或负数的情况
        if (this.getTicket() <= 0){
            return;
        }
        System.out.println(Thread.currentThread().getName() + ": " + ticket);
        ticket--;
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class Test4 {
    public static void main(String[] args) {
        MyTheard4 myTheard4 = new MyTheard4(10);
        new Thread(myTheard4, "线程A").start();
        new Thread(myTheard4, "线程B").start();
        new Thread(myTheard4, "线程C").start();
    }
}

同步代码块

@Data
@AllArgsConstructor
@NoArgsConstructor
class MyTheard4 implements Runnable{
    private int ticket;
    @Override
    public void run() {
        while (this.getTicket() > 0){
            test();
        }
    }
    // 普通方法
    public void test(){
        // 同步代码块
        synchronized (this) {
            if (this.getTicket() <= 0) {
                return;
            }
            System.out.println(Thread.currentThread().getName() + ": " + ticket);
            ticket--;
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class Test4 {
    public static void main(String[] args) {
        MyTheard4 myTheard4 = new MyTheard4(10);
        new Thread(myTheard4, "线程A").start();
        new Thread(myTheard4, "线程B").start();
        new Thread(myTheard4, "线程C").start();
    }
}

标签:同步,java,void,getTicket,线程,test,public
From: https://www.cnblogs.com/hangychn/p/17178381.html

相关文章

  • java 创建线程
    继承ThreadclassMyThread1extendsThread{@Overridepublicvoidrun(){System.out.println("继承Thread...");}}publicclassTest1{......
  • java 线程状态
    线程状态java.lang.Thread.State里明确了线程的各个状态以及怎么进入和退出各个状态publicenumState{//初始化状态,线程创建之后的状态,newThread()之后进......
  • Java集合LinkedList源码中 实现 List 接口 却没有 在 LinkedList实现全部的 List接口
    Java集合LinkedList源码中实现List接口却没有在LinkedList实现全部的List接口方法普通类实现接口,应该实现接口中全部的抽象方法。难道是源码实现接口有什么特殊的......
  • Join线程插队
    packagecom.Java;//Join线程插队必须执行完再执行其他线程publicclassTestJoinimplementsRunnable{@Overridepublicvoidrun(){for(inti=0;......
  • Java 需要快速读出和写入的框架架构
    //对标牛客竞赛小白月赛109a题//importjava.util.*;importjava.io.*;publicclassMain{staticlongn;staticBufferedReaderbf=newBufferedReader(n......
  • java中 += 的作用
    编程语言中数据类型之间的区别,大的数据类型转换给小的会无法转换,所以在一些小的数据类型运算的时候一般会默认使用int以上的数据类型运算,当你使用byte,short,char类型运算......
  • java——spring boot集成RabbitMQ——高级特效——死信代码示例
    首先,消息成为死信的条件:       首先看消息生产者,生产者和之前的一样,没什么变化(注意:后面统一把nomal改为normal了):          消费......
  • java HashSet 原理
    其实就是HashMap,明白了HashMap就会明白HashSet原理创建HashSet底层就是创建了一个HashMapHashSet添加一个元素就是往HashMap添加一个元素HashSet获取元素,......
  • Spring Boot @Scheduled 是同步还是异步,单线程还是多线程?
    @schedule刚开始用的时候回遇到一些坑,主要就是他的同步、异步、多线程的配置问题,这篇文章介绍了@schedule的使用方法,读者遇到问题时可以参考下。1.问题@schedule注解默......
  • 3.理解JavaScript的执行上下文、执行上下文栈,可以应用堆栈信息快速定位问题
    1.执行上下文执行上下文就是当前JavaScript代码被解析和执行时所在环境的抽象概念,JavaScript中运行任何的代码都是在执行上下文中运行1.执行上下文的类型全局执行......