问:为什么说java的syncronized关键字的效率很低?
这是因为,java中线 程是映射到操作系统的原生线程上的。如果要唤醒或者是阻塞一条线程需要操作系统的帮忙。这就需要从用户态转换到核心态。因此,状态转换需要相当长的时间。 所以说syncronized关键字是java中比较重量级的操作。虚拟机本身会做一些优化。比如,在通知操作系统阻塞线程之前,加入一段自旋等待过程, 避免频繁的切入到和心态中。
除了syncronized关键字,java中还可以使用java.lang.concurrent包中的ReentrantLock来实现同步。在基本用法上,二者类似。但是ReentrantLock增加了一些高级特性,只要有以下三个:
第一、等待可中断
第二、公平锁
第三、锁绑定多个条件
等待可中断是指,等待的线程在等待超过一定时间之后,可以选择继续等待,或者也可以不等待直接去做其他事情了。这对于执行时间非常长的同步块来说很有用。
公平锁是指,线程必须按照排队的顺序来获得锁,而非公平锁则不保证这一点。在非公平锁中,任何一个等待的线程都有可能获得锁。
锁绑定多个条件是指,一个 ReentrantLock对象可以同时绑定多个Condition对象。而在syncronized中,锁对象的wait和notify或者是 notifyall方法可以实现一个隐含的条件,如果要和多于一个的条件进行关联的时候,则不得不额外的添加一个锁。ReentrantLock不需要额 外的添加一个锁,只需要多次调用newCondition()方法即可。
与syncronized相比,ReentrantLock的性能可以保持在一个比较稳定的水平。从java1.6开始,syncronized与ReentrantLock在性能上完全持平了。所以在1.6之后,性能就不是选择ReentrantLock的原因了。
---------------------------------------------------------------------------------------
锁的优化
jvm针对锁进行了一些优化
第一、自旋锁和自适应自旋
第二、锁消除
第三、锁粗化
第四、轻量级锁
第五、偏向锁
其中,自旋锁,是指线程在等待一个锁的时候,不放弃cpu时间,而是在忙等。这个功能是有缺点的,比如说,等待时间过长,那么自旋只会白白浪费cpu时间。如果等待时间很短,那么自旋倒是很有价值。
自适应自旋锁于是诞生了。如果上一次自旋成功了,那么自适应自旋锁会认为下一次等待也应该会成功,于是可以适当的放宽自旋的等待时间。如果之前一直自旋失败,那么会省掉这个自旋过程,直接进入线程挂起。
锁消除是指,根据代码逃逸技术,如果判断到一段代码中,堆上的数据不会逃逸出当前线程,那么可以认为这段代码是线程安全的,不必要加锁比如说String a="a"+"b",这段代码中其实是有锁的【想想StringBuffer】,但是编译器把锁给优化掉了。
锁粗化,什么是粗化??比如说String a="a"+"b"+"c",这里其实是有多个锁操作的。但是在同一个函数里面,是没有代码竞争的,根本就没有必要进行锁操作。于是,编译器就可以优化掉这部分锁操作。
轻量级锁,是JDK1.6新增的锁机制。这里的轻量级是针对需要操作系统互斥量来实现的传统锁而言的。因此传统的锁被称作是“重量级锁”。轻量级锁并不是用来取代重量级锁的,他的本意是在没有多线程竞争的情况下,减少传统的重量级锁使用操作系统互斥量产生的性能损耗。
偏向锁,也是1.6才引入的一项锁优化。目的是为了消除数据在无竞争的情况下的同步原语。进一步提高程序的性能。偏 向锁就是“偏袒”第一个获得这个锁的线程,如果在接下来的执行过程中,该锁没有被其他线程获取,那么该线程将永远不需要再次进行同步。但是当另外一个线程 尝试获取该锁的时候,偏向模式宣告结束。根据锁定对象的当前状态,撤销偏向后恢复到未锁定状态或者是进入轻量级锁定状态。可以看出,如果程序中大多数的锁 都是被多个线程所访问的,那么偏向锁就是多余的。
相关推荐
Java锁机制是Java多线程编程中的核心概念之一,其主要目的是确保在多线程环境下,多个线程能够安全地访问共享资源,避免数据不一致的问题。Java锁机制的发展历经了多个版本的改进,尤其是Java 5.0引入的显示锁...
"Java 锁机制 Synchronized" Java 锁机制 Synchronized 是 Java 语言中的一种同步机制,用于解决多线程并发访问共享资源时可能出现的一些问题。 Java 锁机制 Synchronized 的概念 在 Java 中,每个对象都可以被...
Java锁机制是多线程编程中的关键概念,用于控制对共享资源的并发访问。在Java中,主要的锁机制包括`synchronized`关键字和`Lock`接口(如`ReentrantLock`)。下面将详细讲解这两种锁机制及其应用。 1. `...
Java锁机制是多线程编程中的关键组成部分,用于控制对共享资源的访问,确保并发环境下的数据一致性。本文将深入探讨Java锁机制,并基于提供的"面向Java锁机制的字节码自动重构框架"来讨论其背后的原理和应用。 在...
通过以上对Java锁机制的详细介绍,可以看出Java在并发控制方面具有丰富的工具和策略,它们能够帮助开发者在多线程编程中处理好资源竞争和线程协作的问题,从而编写出高效且线程安全的应用程序。
根据提供的文件内容,以下是关于“面向Java锁机制的字节码自动重构框架”的详细知识点解析: 1. Java锁机制 Java语言提供了多种锁机制,包括同步锁(synchronized),可重入锁(ReentrantLock)和读写锁(ReadWriteLock)...
java锁机制Synchronized.pdf
java锁机制Synchronized参考.pdf
java锁机制Synchronized[归纳].pdf
5. 重量级锁:重量级锁是 synchronized 锁的一种实现方式,使用互斥量来实现锁机制。 二、ReentrantLock 锁 1. 锁的原理:ReentrantLock 锁是基于 AQS(AbstractQueuedSynchronizer)机制来实现的。 2. 锁的分类:...
#### 一、Java锁机制概览 Java中的锁机制主要用于解决多线程环境下的资源竞争问题。在并发编程中,为了保证数据一致性与正确性,通常需要采用各种锁来控制对共享资源的访问。Java语言提供了多种锁机制,包括`...
Java锁机制Lock用法示例 Java锁机制Lock是Java并发编程中的一种同步机制,用于解决多线程安全问题。Lock机制是Java 1.5以后引入的显示锁机制,相比于传统的synchronized隐式锁机制,Lock机制提供了更灵活和高效的...
Java 锁机制详解 Java 中的锁机制是多线程同步机制的核心,用于控制多个线程访问共享资源。锁机制可以防止多个线程同时访问共享资源,避免线程之间的干扰和冲突。 锁定义 锁是一种用来管理控制多线程访问共享资源...