1.synchronized 用在方法和代码块上有什么区别呢?

synchronized 用在方法签名上(以test为例),当某个线程调用此方法时,会获取该实例的对象锁,方法未结束之前,其他线程只能去等待。当这个方法执行完时,才会释放对象锁。其他线程才有机会去抢占这把锁,去执行方法test,但是发生这一切的基础应当是所有线程使用的同一个对象实例,才能实现互斥的现象。否则synchronized关键字将失去意义.

(但是如果该方法为类方法,即其修饰符为static,那么synchronized 意味所有的对这个类方法引用的地方都会互斥)

当线程运行到该代码块内,就会拥有obj对象的对象锁,如果多个线程共享同一个Object对象,那么此时就会形成互斥!特别的,当obj == this时,表示当前调用该方法的实例对象。即public void test() {

...

synchronized(this) {

// todo your code

}

...

}

此时,其效果等同于

public synchronized void test() {

// todo your code

}

小结:

使用synchronized 代码块相比方法有两点优势:

1、可以只对需要同步的使用

2、与wait()/notify()/nitifyAll()一起使用时,比较方便

2.wait() 与notify()/notifyAll()区别?

这三个方法都是Object的方法,并不是线程的方法!

wait():释放占有的对象锁,线程进入等待池,释放cpu,而其他正在等待的线程即可抢占此锁,获得锁的线程即可运行程序。而sleep()不同的是,线程调用此方法后,会休眠一段时间,休眠期间,会暂时释放cpu,但并不释放对象锁。也就是说,在休眠期间,其他线程依然无法进入此代码内部。休眠结束,线程重新获得cpu,执行代码。wait()和sleep()最大的不同在于wait()会释放对象锁,而sleep()不会!

notify(): 该方法会唤醒因为调用对象的wait()而等待的线程,其实就是对对象锁的唤醒,从而使得wait()的线程可以有机会获取对象锁。调用notify()后,并不会立即释放锁,而是继续执行当前代码,直到synchronized中的代码全部执行完毕,才会释放对象锁。JVM则会在等待的线程中调度一个线程去获得对象锁,执行代码。需要注意的是,wait()和notify()必须在synchronized代码块中调用。

notifyAll()则是唤醒所有等待的线程。

3.为什么wait() 与notify()/notifyAll() 要放在synchronized中?

参考问题4,wait()方法会释放占有的对象锁,而要释放,必须先占有,故用synchronized保证只有当前线程才能占有对象锁

4.wait()和sleep()的区别?

释放占有的对象锁,线程进入等待池,释放cpu,而其他正在等待的线程即可抢占此锁,获得锁的线程即可运行程序。而sleep()不同的是,线程调用此方法后,会休眠一段时间,休眠期间,会暂时释放cpu,但并不释放对象锁。也就是说,在休眠期间,其他线程依然无法进入此代码内部。休眠结束,线程重新获得cpu,执行代码。

wait()和sleep()最大的不同在于wait()会释放对象锁,而sleep()不会!

5.Lock与synchronized 的区别?

synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中

总结来说,Lock和synchronized有以下几点不同:

1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;

2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使       用Lock时需要在finally块中释放锁;

3)Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;

4)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。

5)Lock可以提高多个线程进行读操作的效率。

在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。

java线程锁为什么要唯一,java线程同步-锁 - 谁说这么长又没有中心思想还与个人技术主题无关的的标题是胡闹??? - OSCHINA - 中文开源技术交流社区...相关推荐

  1. java通讯方式_Java线程通讯方式 - osc_63rgy8af的个人空间 - OSCHINA - 中文开源技术交流社区...

    l  休眠唤醒方式: Object的wait.notify.notifyAll Condition的await.signal.signalAll l  CountDownLatch:用于某个线程A等待 ...

  2. java 锁的类型_Java锁的种类 - shawnplaying的个人页面 - OSCHINA - 中文开源技术交流社区...

    Java锁和并发需要结合在一块了理解,涉及到了多个话题. 本文主要参考了 http://ifeve.com/java_lock_see1/ 但是我认为原文中有某些错误,我在下面的代码中做了修改. 公平 ...

  3. java 原子量_Java原子量 - Rickxue的个人空间 - OSCHINA - 中文开源技术交流社区

    所谓的原子量即操作变量的操作是"原子的",该操作不可再分,因此是线程安全的. 为何要使用原子变量呢,原因是多个线程对单个变量操作也会引起一些问题.在Java5之前,可以通过vola ...

  4. 最新JAVA性能调优实战教程_java性能调优实战 - osc_9z8xc00s的个人空间 - OSCHINA - 中文开源技术交流社区...

    在项目压测过程中,发现系统占用,上下文切换非常频繁,在此记录下调优过程,希望对后来人有所帮助. 测试方法:模拟客户端实际操作,向服务器高并发发送数据,查看服务器的负载情况. 服务器基本配置如下 1,基 ...

  5. java sync_Java同步简介 - 加大装益达 - OSCHINA - 中文开源技术交流社区

    原文链接 [TOC] Java同步 Java中同步一直都是很重要的问题,对于初学者来说也是不太容易能理解的问题.特在此记录一下有关Java中同步和锁的知识.主要涉及到同步的概念以及Java中解决的办法 ...

  6. java用来存储键值的容器是_Java容器 - osc_y0caef0i的个人空间 - OSCHINA - 中文开源技术交流社区...

    问题及答案来源自<Java程序员面试笔试宝典>第四章 Java基础知识 4.9容器 1.Java Collections框架是什么? Java Collections框架中包含了大量集合接 ...

  7. java的mythread_java多线程 - myShadow - OSCHINA - 中文开源技术交流社区

    Java中Runnable和Thread的区别 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口: Thread类是在java.lang包中定义的.一个类只 ...

  8. java 伪异步 netty,Netty(一) - 不死的达芬奇的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.我们先来看BIO的问题: 1  没有数据缓冲区,I/O性能存在问题: 2  没有C或C++中的Channel概念,只有输入和输出流: 3  通常会导致通信线程被长时间阻塞: 4  支持的字符集有限 ...

  9. java 在界面上画一个时钟_编写程序显示一个时钟 - javaCoder的个人页面 - OSCHINA - 中文开源技术交流社区...

    编写程序显示一个时钟.示例输出如图所示. 代码: package com.DisplayClock; import javax.swing.*; import java.awt.*; import j ...

最新文章

  1. 浅谈bash shell的种类以及linux系统中的profile和bashrc配置文件
  2. 实业逻辑与品牌逻辑的矛盾
  3. err=etherbase address must be explicitly specified
  4. Java Web架构实战篇:聊一聊前后端分离架构
  5. 网页英文 错位_网页错位原因解决方法
  6. 英特尔® 实感™ SDK 架构
  7. IDEA创建JSP项目
  8. jquery日历插件 途牛_jQuery日历插件FullCalendar中文版
  9. 两款WiFi无线网络扫描工具软件:WirelessMon、Xirrus WiFi Inspector
  10. Excel 使用技巧集锦—163种技巧
  11. 专题:固体力学中应力与应变分析详解(1.应力分析 2.符号 3.一般的三维应力场)
  12. 返回未知项目请重新安装服务器,ppt2003插入图表时显示:“无法找到服务器应用程序,源文件和项目,或返回的未知错误。请重新安装服务程序?(excel显示未知图表)...
  13. 计算机网络——集线器与交换机
  14. 西安电子科技计算机学院导师,西安电子科技大学计算机学院研究生导师简介-李金库...
  15. Python zip zip_longest
  16. (三)对图像进行Gauss高斯平滑处理
  17. c调用c++:opencv c版本打开相机方法
  18. 用文件记录游戏最高分【C语言】
  19. 利用matlab将.mat格式文件转换成wav文件
  20. 口腔类小程序开发设计方案

热门文章

  1. javacc编译原理实训报告
  2. java多语言网页_网页多国语言实现
  3. Android 自定义 Toast
  4. Tomcat修改内存
  5. c语言编译器做病毒,来来来,教你一个用C语言写个小病毒
  6. 快鲸智慧楼宇:为楼宇智慧化、物联化、可视化、数字化运营赋能
  7. 通讯录软件测试报告,手机APP测试报告记录.doc
  8. 30岁打算转行做机器学习是不是晚了?
  9. 汇川H5U走EtherCat控制伺服带HMI程序,轴控制和气缸控制有做功能块
  10. 使用vueAdmin-template,java后台不能接收到参数