Synchronized 与 Lock 的使用
创始人
2024-04-08 18:21:07
0

Synchronized的使用

        以卖票为例

//基本的卖票例子/*真正的多线程开发,公司中的开发,降低耦合性线程就是一个单独的资源类,没有任何附属的操作1.属性、方法*/
public class SaleTicketDemo01 {public static void main(String[] args) {//多个线程操作同一个资源类Ticket ticket = new Ticket();//@FunctionalInterface 函数式接口,jdk1.8 lambda表达式 (参数)->{ 代码 }new Thread(()->{for (int i = 0; i < 60; i++) {ticket.sale();}},"A").start();new Thread(()->{for (int i = 0; i < 60; i++) {ticket.sale();}},"B").start();new Thread(()->{for (int i = 0; i < 60; i++) {ticket.sale();}},"C").start();}}class Ticket {//属性、方法private int number = 50;//卖票的方式//synchronized 本质:队列,锁public synchronized void sale(){if (number>0){System.out.println(Thread.currentThread().getName()+"卖出了1张票,剩余"+--number+"张票");}}}

Lock锁

        需要手动加锁,释放锁

  Lock锁是一个接口,他有三个实现类:

  • ReentrantLock类
  • ReentrantReadWriteLock.ReadLock
  • ReentrantReadWriteLock.WriteLock

        以卖票为例

//基本的卖票例子import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*真正的多线程开发,公司中的开发,降低耦合性线程就是一个单独的资源类,没有任何附属的操作1.属性、方法*/
public class SaleTicketDemo02 {public static void main(String[] args) {//多个线程操作同一个资源类Ticket2 ticket = new Ticket2();//@FunctionalInterface 函数式接口,jdk1.8 lambda表达式 (参数)->{ 代码 }new Thread(()->{for (int i = 0; i < 5; i++) {ticket.sale();}},"A").start();new Thread(()->{for (int i = 0; i < 5; i++) {ticket.sale();}},"B").start();new Thread(()->{for (int i = 0; i < 5; i++) {ticket.sale();}},"C").start();}}class Ticket2 {//属性、方法private int number = 15;Lock lock = new ReentrantLock();//lock三部曲//1. new ReentrantLock()//2.lock.lock(); //加锁//3.finally =>lock.unlock(); //解锁public synchronized void sale(){lock.lock(); //加锁try {//业务代码if (number>0){System.out.println(Thread.currentThread().getName()+"卖出了1张票,剩余"+--number+"张票");}} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();  //解锁}}}

Lock锁和synchronized的区别

  1. Synchronized是内置Java关键字;Lock是一个Java类。
  2. Synchronized无法判断获取锁的状态;Lock可以判断是否获取到了锁。(boolean b = lock.tryLock();)
  3. Synchronized会自动释放锁;Lock必须要手动释放锁,如果不释放锁,死锁。
  4. Synchronized线程1获得锁阻塞时,线程2会一直等待下去;Lock锁线程1获得锁阻塞时,线程2等待足够长的时间后中断等待,去做其他的事。
  5. Synchronized可重入锁,不可以中断的,非公平;Lock,可重入锁,可以判断锁,非公平(可手动设置为公平锁)。
  6. Synchronized适合锁少量的代码同步问题;Lock适合锁大量的同步代码。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...