多线程--同步--方式/对比

港控/mmm° 2023-07-20 05:55 93阅读 0赞

原文网址:多线程—同步—方式/对比_IT利刃出鞘的博客-CSDN博客

Java线程同步的实现方式

其他网址

JAVA多线程——实现同步_Java_weixin_38719347的博客-CSDN博客
Java 线程同步几种方式 - - ITeye博客
Java中的锁分类与使用 - hustzzl - 博客园

简介

Juc(java.util.concurrent)里有以下内容:原子类、锁、线程池、并发集合(List,Map)等。

线程同步的实现方式(前四种比较常用)














































方式 优点 缺点 使用场景
synchronized 使用简单;CPU占用低 响应缓慢(并发性能差);不灵活。

并发量低;大的代码块

同步方法/代码块

java.util.concurrent.locks.
(锁)

并发性能高;灵活

CPU占用高(CAS通病);需手动加锁、释放锁 例如:可重入锁(ReentrantLock)
java.util.concurrent.atomic.
(原子变量)
并发性能高(比locks还高) 只能锁一个变量 可升级为原子变量队列
ThreadLocal
wait(),notify() 
(等待与唤醒)

java.util.concurrent.BlockingQueue
(阻塞队列)

synchronized与volatile比较

其他网址

JMM系列—综述_feiying0canglang的博客-CSDN博客


































比较方面

synchronized

volatile

作用

锁定当前对象,只有当前线程可以访问该对象,其他线程被阻塞。

本质是在告诉 jvm 当前变量在寄存器(工作内存)中的值是不确定的。

实际上,一个变量被声明为volatile时,线程在写入变量时不会把值缓存在寄存器或者其他地方,而是会把值刷新回主内存。当其他线程读取该共享变量时,会从主内存重新获取最新值,而不是使用当前线程的工作内存中的值。

使用范围

变量、方法、和类

变量

线程安全

可以保证变量的原子性、可见性、有序性

保证变量的可见性和顺序性,不能保证原子性

阻塞

可能会造成线程的阻塞

不会造成线程的阻塞

优化

标记的变量可以被编译器优化

标记的变量不会被编译器优化

synchronized与Lock比较

其他网址

synchronized 和Lock区别_Java_洞玄之境的博客-CSDN博客
synchronized和lock的区别(底层实现) - 简书

















































synchronized

Lock

存在层面

java 内置关键字,在 jvm 层面

java 类(实际是一个接口),在API层面

锁的释放

会自动释放锁:

线程执行完同步代码会释放锁 ;

线程执行中发生异常会释放锁;(获得锁的线程)

需在 finally 中手工释放锁(unlock()方法释放锁)

锁的获取

若线程 1 获得锁,线程 2 等待;

若线程 1 阻塞,线程 2 会一直等待

分情况而定,Lock有多个获得锁的方式。

可尝试获得锁,线程可以不用一直等待

锁状态

无法判断是否已经获取锁

可判断是否已经获取到锁

锁类型

可重入、不可中断、非公平

可重入、可中断、可公平(两者皆可)

是否可被中断

只有获取到锁之后才能中断,等待锁时不可中断。

等待锁时可用interrupt来中断等待

适用场景

少量线程的同步。

大量线程的同步。

性能

jdk1.6以前:重量级锁(无法取得锁即挂起)。

jdk1.6之后:优化了性能(锁自动升级)。

1. Lock 锁可以提高多个线程进行读的效率(使用 readWriteLock)

2. 竞争不激烈的情况下,synchronized的性能优于ReetrantLock;竞争激烈时,synchronized的性能会下降几十倍,但ReetrantLock的性能维持常态;

3. ReetrantLock 提供了多样化的同步,比如有时间限制的同步,可以被Interrupt的同步(synchronized的同步是不能Interrupt的)等。

synchronized与ReentrantLock比较

其他网址

Synchronized与ReentrantLock区别总结_Java_zxd8080666的博客-CSDN博客

相同点

  1. 它们都是加锁方式同步;
  2. 都是可重入锁;
  3. 阻塞式的同步;

不同点

因为ReentrantLock实现了Lock,所以拥有synchronized与Lock的所有不同点,其他不同点如下:

  1. ReentrantLock:多个线程在等待的时候,可以提供公平的锁(默认的是非公平锁,性能会比公平锁好一些)
  2. ReenTrantLock 可以绑定多个锁条件

发表评论

表情:
评论列表 (有 0 条评论,93人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线-线同步

    线程同步:协调多个线程间的并发操作,以获得符合预期的,确定的执行结果,消除多线程应用程序的不确定性. 使用线程的同步:可以保护资源同时只能由一个线程访问,一般采取的措施是获取

    相关 线同步

    第一种同步方式:ReentrantLock类 一旦一个线程封锁了锁对象,其他任何线程都无法通过lock语句。当其他线程调用lock时,它们被阻塞,直到第一个线程释放锁对象。如