Java多线程:syschronized,lock优缺点及demo

lock相比syschronized,任何一个新的技术是对已有技术的优化和补充

同一时刻只允许有一个线程访问代码块的机制,是为了保证线程安全而生(存储数据的集合数据安全)。

创建锁的3种方式:继承Thread类,实现接口runable,callable

syschronized:队列,锁,通一时间只有一个队列消费
区别
1、synchronized是java关键字,而Lock是java中的一个接口
2、synchronized会自动释放锁,而Lock必须手动释放锁
3、synchronized是不可中断的,Lock可以中断也可以不中断
4、通过Lock可以知道线程有没有拿到锁,而synchronized不能
5、synchronized能锁住方法和代码块,而Lock只能锁住代码块
6、Lock可以使用读锁提高多线程读效率
7、synchronized是非公平锁,ReentranLock可以控制是否公平锁

1 lock():获取锁,如果锁被暂用则一直等待
2 unlock():释放锁
3 tryLock(): 注意返回类型是boolean,如果获取锁的时候锁被占用就返回false,否则返回true
4 tryLock(long time, TimeUnit unit):比起tryLock()就是给了一个时间期限,保证等待参数时间
5 lockInterruptibly():用该锁的获得方式,如果线程在获取锁的阶段进入了等待,那么可以中断此线程,先去做别的事

-----demo---------
package com.chen.thread;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**

  • 使用场景:生产线:下单完成唤醒执行支付--》支付成功唤醒交易-->交易成功唤醒 物流

  • 按顺序执行的场景
    */
    public class LcckTest1 {
    public static void main(String[] args) {
    Data3 data3=new Data3();
    new Thread(()->{
    for (int i = 0; i < 10; i++) {
    data3.PrintA();
    }
    },"A").start();

    new Thread(()->{
    for (int i = 0; i < 10; i++) {
    data3.PrintB();
    }
    },"B").start();

    new Thread(()->{
    for (int i = 0; i < 10; i++) {
    data3.PrintC();
    }
    },"C").start();
    }

}

class Data3 {
private Lock lock = new ReentrantLock();
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();

private int numer = 1;

public void PrintA() {
lock.lock();
try {
while (numer != 1) {
condition1.await();
}
System.out.println(Thread.currentThread().getName() + "==>A");
numer = 2;
condition2.signal(); //执行完成唤醒2
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

public void PrintB() {
lock.lock();
try {
while (numer != 2) {
condition2.await();
}
System.out.println(Thread.currentThread().getName() + "==>B");
numer = 3;
condition3.signal(); //执行完成唤醒3
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

public void PrintC() {
lock.lock();
try {
while (numer != 3) {
condition3.await();
}
System.out.println(Thread.currentThread().getName() + "==>C");
numer = 1;
condition1.signal(); //执行完成唤醒1
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}

结果按顺序输出:
A>A
B
>B
C>C
A
>A
B>B
C
>C
A>A
B
>B
C>C
A
>A
B>B
C
>C
A>A
B
>B
C>C
A
>A
B>B
C
>C
A>A
B
>B
C>C
A
>A
B>B
C
>C
A>A
B
>B
C>C
A
>A
B>B
C
>C

posted @ 2024-06-05 10:49  大树2  阅读(99)  评论(0)    收藏  举报