首页 > 编程知识 正文

java基本类型有哪些,java程序的种类有哪些

时间:2023-05-06 03:01:05 阅读:155980 作者:241

文章目录区分Java锁的种类和公平锁/非公平锁,锁可以重新插入傲慢的日记本/共享锁互斥锁/读写锁乐观锁/悲观锁阶段锁偏向锁/轻量锁/重量锁自旋锁

区分JVA锁类型和公平锁/非公平锁的公平锁是指按照多个线程申请锁的顺序获取锁。 不公平锁是指多个线程获取锁的顺序不是申请锁的顺序,而是指以后申请的线程可能会优先于之前申请的线程获取锁。 有可能。 优先顺序逆转,发生饥饿。

公平锁的性能比不公平锁差得多。

如果是ReentrantLock,则在构造函数中指定锁是否为公平锁时,缺省情况下将为不公平锁。 不公平锁的优点是吞吐量大于公平锁。 对Synchronized来说也是不公平的锁定。 由于不像ReentrantLock那样通过AQS实现线程调度,所以没有任何方法可以实现公平的锁定。

ReentrantLock对中断进行响应,synchronized在尝试获取锁时等待直到获取锁。

synchronized的特点是使用方便,一切交给JVM,不需要释放显示器。

ReentrantLock比同步锁定稍微复杂一点。 因为必须在finally中进行锁定解除操作,所以如果不在finally中解除锁定,则代码有异常,可能无法解除锁定。 可重入、可中断、可限制时间。

可重入锁可重入锁也称为递归锁,在同一线程通过外部方法获取锁时,当进入内部方法时会自动获取锁。 在一定程度上可以避免死锁。

傲慢的日记本/共享锁傲慢的日记本意味着一次只能在一个线程上拥有该锁。 共享锁是指多个线程可以拥有该锁。 ReentrantLock和Synchronized是傲慢的日记。

对于ReadWriteLock,读锁定为共享锁定,写锁定为傲慢的日记本。

读锁共享锁确保了并发读非常高效,并且读写、写过程互斥。 傲慢的日记本和共享锁也通过AQS实现,通过实现不同的方法实现独占或共享。 Java中排他锁定/读写锁定排他锁定的具体实施,是ReentrantLock读写锁定的Java中的具体实施,是ReadWriteLock乐观锁定/悲观锁定悲观锁认为对于同一个数据的并发操作因此,对于同一数据的同时操作,悲观锁定采取加锁的形式。 悲观地想,不加锁的同时操作一定有问题。乐观锁则认为对于同一个数据的并发操作不会被修改。 更新数据时,尝试更新,通过不断更新来更新数据。 乐观地说,没有什么不上锁的同时操作。 悲观锁定适用于具有大量写入操作的场景,而乐观锁定适用于具有大量读取操作的场景,不锁定将大大提高性能。

在Java中使用悲观锁是利用各种锁。 乐观锁在Java中的使用是无锁编程,经常采用CAS算法。 典型的例子是原子类,通过CAS自旋实现原子操作的更新。 段锁ConcurrentHashMap中的分段锁称为Segment,它即类似于HashMap(JDK7与JDK8中HashMap的实现)的结构,即内部拥有一个Entry数组,数组中的每个元素又是一个链表;同时又是一个ReentrantLock(Segment继承了ReentrantLock)。

在需要put元素的情况下,不是锁定整个hashmap,而是首先通过hashcode知道他要放入该段,然后锁定该段,所以对于多线程put,除非放入一个段,否则是真正的并行但是,在统计size时,但是在获取hashmap全局信息时,必须获取所有的段锁才能进行统计。 分段锁定的目的是细化锁定的粒度,在操作中不需要更新数组整体的情况下,只对其中一个数组进行锁定操作。

偏转锁定/轻量锁定/重量锁定这三种锁定是指锁定的状态,并且针对Synchronized。

偏转锁定是指当同步代码的一部分被线程访问时,线程自动获取锁定。 降低获取锁定的成本。 轻量级锁是指如果锁是偏转锁,则当被其他线程访问时,偏转锁将升级为轻量级锁,而其他线程将尝试以旋转形式获取锁,从而不会阻塞,从而提高性能。 重摇滚是指当摇滚是轻型摇滚时,尽管其他线程是自旋,但自旋不会一直持续,在旋转一定次数时,没有获得摇滚就进入了闭塞,该摇滚会膨胀为重摇滚。 重锁定会阻塞其他申请线程,从而降低性能。 自旋锁内置在Java中。 旋转锁是指尝试获取锁的线程尝试采用循环方法获取锁,而不是立即阻塞。 这样做的好处是减少了线程上下文切换的消耗。 缺点是循环消耗CPU。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。