JAVA语言使用两种机制来实现堆某种共享资源的同步,synchronized和Lock。其中,synchronized使用Object对象本身的notify、wait、notifyAll调度机制,而lock可以使用Condition进行线程之间的调度,完成synchronized实现所有功能。

具体而言,两者的主要区别主要表现在以下几个方面:

1)用法不一样。在需要同步的对象中加入synchronized控制,synchronized既可以加在方法上,也可以加在特定代码中,括号中表示需要锁的对象。而Lock需要显示的指定起始位置和终点位置。synchronized是托管给JVM执行的,而Lock的锁定是通过代码实现的,它有比synchronized更精确的线程定义

2)性能不一样。在JDK 5中增加的ReentrantLock。它不仅拥有和synchronized相同的并发性和内存语义,还增加了锁投票,定时锁,等候和中断锁等。它们的性能在不同情况下会不同:在资源竞争不是很激励的情况下,synchronized的性能要优于ReentrantLock,带在资源紧张很激烈的情况下,synchronized的性能会下降的很快,而ReentrantLock的性能基本保持不变。

3)锁机制不一样。synchronized获得锁和释放锁的机制都在代码块结构中,当获得锁时,必须以相反的机制去释放,并且自动解锁,不会因为异常导致没有被释放而导致死锁。而Lock需要开发人员手动去释放,并且写在finally代码块中,否则会可能引起死锁问题的发生。此外,Lock还提供的更强大的功能,可以通过tryLock的方式采用非阻塞的方式取获得锁。

虽然synchronized和Lock都可以用来实现线程同步,但最好不要同时使用两种放式,因为synchronized和ReentrantLock所使用的机制不同,但是他们是独立运行的,相当于两种类型的锁,在使用时不会影响。示例如下:

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class SyncTest {
private int value;
Lock lock = new ReentrantLock();
public synchronized void addValueSync(){
this.value++;
System.out.println(Thread.currentThread().getName()+":"+value);
}
public void addValueLock(){
try {
lock.lock();
value++;
System.out.println(Thread.currentThread().getName()+":"+value);
}finally {
lock.unlock();
}
}
}
public class Main {
public static void main(String[] args){
final SyncTest st = new SyncTest();
Thread t1 = new Thread(
new Runnable(){ @Override
public void run() {
// TODO Auto-generated method stub
for(int i = 0;i<5;i++){
st.addValueSync();
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}}
);
Thread t2 = new Thread(
new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
for(int i = 0;i <5 ;i++){
st.addValueLock();
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}
);
t1.start();
t2.start();
}
}

synchronized和Lock的异同的更多相关文章

  1. java中synchronized与Lock的异同

    本文转载自java中synchronized与Lock的异同 前言 synchronized和Lock通过互斥保障原子性,能够保护共享数据以实现线程安全,其作用包括保障原子性.可见性.有序性 常见问题 ...

  2. synchronized 和 java.util.concurrent.locks.Lock 的异同 ?

    主要相同点:Lock 能完成 synchronized 所实现的所有功能 主要不同点:Lock 有比synchronized 更精确的线程语义和更好的性能. synchronized 会自动释放锁,而 ...

  3. 线程安全、数据同步之 synchronized 与 Lock

    本文Demo下载传送门 写在前面 本篇文章讲的东西都是Android开源网络框架NoHttp的核心点,当然线程.多线程.数据安全这是Java中就有的,为了运行快我们用一个Java项目来讲解. 为什么要 ...

  4. 【转载】synchronized 与 Lock 的那点事

    最近在做一个监控系统,该系统主要包括对数据实时分析和存储两个部分,由于并发量比较高,所以不可避免的使用到了一些并发的知识.为了实现这些要求,后台使用一个队列作为缓存,对于请求只管往缓存里写数据.同时启 ...

  5. 转:synchronized和LOCK的实现原理---深入JVM锁机制

    JVM底层又是如何实现synchronized的? 目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug ...

  6. synchronized 与 Lock 的那点事

    最近在做一个监控系统,该系统主要包括对数据实时分析和存储两个部分,由于并发量比较高,所以不可避免的使用到了一些并发的知识.为了实现这些要求,后台使用一个队列作为缓存,对于请求只管往缓存里写数据.同时启 ...

  7. JAVA中synchronized和lock详解

         目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronize ...

  8. Java多线程编程(四)—浅谈synchronized与lock

    一.共享资源竞争问题 在Java语言的并发编程中,由于我们不知道线程实际上在何时运行,所以在实际多线程编程中,如果两个线程访问相同的资源,那么由于线程运行的不确定性便会在这种多线程中产生访问错误.所以 ...

  9. synchronized和lock比对

    前言:在上面的博客说了synchronized的一些用法,下面我们再来看看lock,这个出现频率也是非常高的一个. 1:获取Lock锁的几种方式 前面说了synchronized有锁对象和锁类对象,当 ...

随机推荐

  1. ViewPager+Fragment切换卡顿解决办法

    1.ViewPager设置预加载 我有4个tag,都不想被销毁,设置预加载个数为3. ViewPager viewPager; viewPager.setOffscreenPageLimit(3); ...

  2. 取消Eclipse等号、分号、空格代码自动补全

      本文主要参考了以下文章 http://www.cnblogs.com/a-zx/p/3388041.html 本文基于 Eclipse Java EE IDE for Web Developers ...

  3. CSS页面布局常见问题总结

    在前端开发中经常会碰到各种类型布局的网页,这要求我们对css网页布局非常熟悉.其中水平垂直居中布局,多列布局等经常会被使用到,今天就来解决一下css布局方面的问题. 水平垂直居中的几种方法 说到水平垂 ...

  4. The stacking context

    文档中的层叠上下文由满足以下任意一个条件的元素形成: 1. z-index 值不为 "auto"的 绝对/相对定位. 2. position位fixed. 3. opacity 属 ...

  5. 第三章 Hyper-V 2012 R2配置选项

    原书中的第二章 是介绍了下hyper-v的管理器和检查点的使用,导入导出虚拟机,所以我跳过了不高兴写,很简单.直接进入第三部分,介绍虚拟机的三个重要组成部分:CPU,内存,硬盘的配置选项. Hyper ...

  6. Nginx:413 Request Entity Too Large

    现象:在 Post 文件的时候遇到413 错误 :Request Entity Too Large: 原因:Nginx 限制了上传文件的大小,需在Nginx中修改/增加允许的最大文件大小: 操作:编辑 ...

  7. rows的参数

    ds.Tables[0].Rows[0][0].ToString()中的rows后边的那俩参数分别代表什么 第一个0表示行的索引(如果是0就表示第一行,1表示第二行……)第二个0表示列的索引(如果是0 ...

  8. linux内网IP如果判断出网IP地址

    [root@jumpserver ~]# curl https://ip.cn当前 IP: 162.14.210.16 来自: 河南省郑州市 xx网络

  9. PHP PC端支付宝扫码支付

    前面的文章已经描述过在蚂蚁金服开放平台创建应用签约等流程,详见:PHP App端支付宝支付,这里就不多说了,剩下的分两步,第一步是支付前的准备工作,也就是整合支付类文件,我已经整合好可以直接用,代码开 ...

  10. python分包写入文件,写入固定字节内容,当包达到指定大小时继续写入新文件

    第6行通过 for 循环控制生成 .log 文件的数量 第8行,如果该文件存在时先进行清空,然后再进行写入操作 第13行,将文件大小的单位转为MB 第14行,如果文件大小超过1MB时,跳出当前循环,重 ...