首先,先明确下synchronized的几个关键点:
A.无论synchronized关键字加在方法上还是对象上,他取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。
B.每个对象只有一个锁(lock)和之相关联。
C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
synchronized可以加在方法上,也可以加在对象上,通常理解为,只有持有了锁才可以进行对应代码块的执行。
java.util.concurrent.locks包下面提供了一些锁的实现,有读写锁,公平锁等。
将synchronized替换成lock的实现可以提升性能:
1. 大部分应用场景是读写互斥,写和写互斥,读和读不互斥。而synchronized则是都互斥。
可以利用读写锁来优化性能,读锁锁住读的代码块,写锁锁住写的代码块。
2. 要确保你在理解原来利用到synchronized的代码逻辑,避免一概而论地把synchronized替换成锁。
比如:
public void getPair(){
return "x="+x + ",y="+y;
}
//这个函数
public synchronized void increment() {
x++;
y++;
getPair();
}
//可以替换成
public void increment() {
lock.lock();
try{
x++;
y++;
getPair();
}finally{
lock.unlock();
}
//但是,如果getPair()是synchronized
public synchronized void getPair(){
return "x="+x + ",y="+y;
}
//还能替换这个函数吗?
public synchronized void increment() {
x++;
y++;
getPair();
}
//这时候就不能简单地使用lock来替换了,这里要调用getPair();必需申请到对象锁,这个时候increment也要竞争这把锁
//因此这里的代码效果是读写互斥。
//如果只是用lock来锁住increment,则达不到效果。还得同时锁getPair();
//这里嵌套了synchronized,而synchronized的嵌套结构中在同一个对象的方法上是共享一把锁的。
//上面只是简单的例子,java编程思想的多线程编程中有更详细的这个例子,有兴趣的可以看看。
}
分享到:
相关推荐
并发编程中,锁是经常需要用到的,今天我们一起来看下Java中的锁机制:synchronized和lock。 Synchronized 和 Lock的概念 Synchronized 是Java 并发编程中很重要的关键字,另外一个很重要的是 volatile。Syncronized...
synchronized和LOCK的实现原理深入JVM锁机制比较好.docx
主要介绍了简单了解synchronized和lock的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
基础理论知识,描述lock和synchronized的区别和基础的理论,其中还有死锁等基础概念。
目录synchronized的缺陷Lock和ReentrantLock常用方法ReadWriteLock和ReentrantReadWriteLockLock和synchronized区别synchronized锁升级公平锁和非公平锁 synchronized的缺陷 众所周知,synchronized锁是JAVA的关键字...
互联网信息泛滥环境下少有的良心之作!如果您想对Java编程synchronized与lock的区别有所了解,这篇文章绝对值得!分享给大家,供需要的朋友参考。不说了,我先学习去了。
lock锁,lock锁和synchronized的对比 # Lock锁 JDK5.0后Java提供了一种更加强大的线程同步机制。一种显式定义同步锁对象来实现锁,提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问...
synchronized 和 Lock 有什么区别? volatile 关键字的作用 # Lock体系 ## Lock简介与初识AQS ### Java Concurrency API 中的 Lock 接口(Lock interface)是什么?对比同步它有什么优势? ReentrantLock(重入锁)...
同样是锁,先说说synchronized和lock的区别: 1.synchronized是java关键字,是用c++实现的;而lock是用java类,用java可以实现 2.synchronized可以锁住代码块,对象和类,但是线程从开始获取锁之后开发者不能进行...
而Lock接口则是一个更底层的同步机制,它提供了更丰富的功能,但需要显式地获取和释放锁,通常通过实现类如ReentrantLock来使用。 其次,从功能特性上来看,synchronized具有可重入性,即同一个线程可以多次获取同...
Synchronized 和 Lock 哪个更好? . HashMap 中的 get()方法是如何实现的? . HashMap 可以用在哪些场景? . JVM,垃圾回收机制,内存划分等 . SQL 优化,常用的索引? . 还有什么问题需要问的。 多线程状态图,...
线程同步Synchronized,监视器monitor和锁lock的关系2---马克-to-win java视频
一、同步省略 二、将堆分配转化为栈分配 三、分离对象或标量替换
详细介绍了Java的多线程之间的同步,对Synchronized和Lock进去深入解析,希望能帮到大家
【Java面试题】lock与synchronized区别
54. synchronized 和 Lock 有什么区别? 21 55. synchronized 和 ReentrantLock 区别是什么? 22 56. 说一下 atomic 的原理? 22 四、反射 23 57. 什么是反射? 23 58. 什么是 java 序列化?什么情况下需要序列化? ...
主要介绍了Java synchronized关键字和Lock接口实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
54.synchronized 和 Lock 有什么区别? 55.synchronized 和 ReentrantLock 区别是什么? 56.说一下 atomic 的原理? 四、反射 57.什么是反射? 58.什么是 java 序列化?什么情况下需要序列化? 59.动态代理是什么?...
NULL 博文链接:https://lf6627926.iteye.com/blog/1328598
线程同步Synchronized,监视器monitor和锁lock的关系2---马克-to-win java视频