synchronized和Lock区别以及Lock如何控制线程执行顺序的例子

本文介绍了一种使用Java的Lock和Condition实现线程间精确调度的方法,通过三个线程A、B、C的示例,展示了如何让它们按照指定顺序交替执行,每个线程分别打印2次、4次和6次,循环进行5轮。此方法适用于需要精确控制线程执行顺序的场景。

提示:这里我只是聊聊自己的理解,相当于自己记个笔记而已,如果有误,请指正。

使用上的区别:(如下图)

最大区别:Lock能实现精准通知,精准唤醒。

例子:多个线程,要求实现调用顺序A->B->C。具体实例:启动三个线程,要求A打印2次,B打印4次,C打印6次......循环5轮(笔试高频题)。

实现代码如下:

package com.xxx.thread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @Author:wrb
 * @Date :2020/2/1/20:30
 * @Describtion:
 **/
public class Damo06 {
    static int num= 1;
    public static void main(String[] args) {
        MyData myData = new MyData();
        new Thread(()->{
            for (int i=0;i<5;i++){
                myData.print5();
            }
        },"A").start();
        new Thread(()->{
            for (int i=0;i<5;i++){
                myData.print10();
            }
        },"B").start();
        new Thread(()->{
            for (int i=0;i<5;i++){
                myData.print15();
            }
        },"C").start();

    }

}

class MyData{
    Lock lock = new ReentrantLock();
    int state = 1;
    Condition condition1 = lock.newCondition();
    Condition condition2 = lock.newCondition();
    Condition condition3 = lock.newCondition();
    public void print2(){
        lock.lock();
        try {
            while (state!=1){
                condition1.await();
            }
            for (int i=1;i<3;i++){
                System.out.print(Thread.currentThread().getName()+i+"\t");
            }
            state=2;
            condition2.signal();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }
    public void print4(){
        lock.lock();
        try {
            while (state!=2){
                condition2.await();
            }
            for (int i=1;i<5;i++){
               System.out.print(Thread.currentThread().getName()+i+"\t");
            }
            state=3;
            condition3.signal();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }
    public void print6(){
        lock.lock();
        try {
            while (state!=3){
                condition3.await();
            }
            for (int i=1;i<7;i++){
                System.out.print(Thread.currentThread().getName()+i+"\t");
            }
            state=1;
            condition1.signal();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }

}

测试结果:

努力奋斗,不负韶华!

 

中间件(Middleware)是指位于操作系统和应用程序之间的软件层,用于协调、管理和支持应用程序的运行。它提供了一组通用的功能和服务,使得应用程序开发和部署更加简化和灵活。 中间件可以提供以下功能: 1. 连接和通信管理:中间件可以处理不同应用程序之间的通信,包括远程过程调用(RPC)、消息传递、数据传输等。 2. 数据库访问:中间件可以提供对数据库的访问接口和连接池管理,简化数据库操作和提高性能。 3. 安全性和身份验证:中间件可以提供身份验证、授权和加密等安全机制,保护应用程序和数据的安全性。 4. 事务管理:中间件可以提供事务处理机制,确保在分布式环境中的数据一致性和完整性。 5. 缓存和性能优化:中间件可以提供缓存机制,减少对后端资源的访问,提高应用程序的性能和响应速度。 JDK(Java Development Kit)是Java开发工具包的缩写,它是Java平台的核心组件之一。JDK包含了用于开发、编译、运行Java应用程序的各种工具和库。 JDK提供了以下主要组件: 1. Java编译器(javac):用于将Java源代码编译成Java字节码。 2. Java运行时环境(JRE):包含了Java虚拟机(JVM)和Java类库,用于执行Java字节码。 3. 开发工具(如Java编译器、调试器等):用于开发和调试Java程序。 4. 额外的库和工具:JDK还提供了许多额外的库和工具,用于开发各种类型的应用程序,如图形界面开发、网络编程、数据库访问等。 总之,JDK是开发和运行Java应用程序所需的基本工具和库集合。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值