synchronized-------Java 关键字
2016-07-22 10:40
405 查看
迟早要走,静心,不必去解释什么,解释了也不一定有正确的回应
在Java中,可以使用synchronized关键字来标记一个方法或者代码块,当某个线程调用该对象的synchronized方法或者访问synchronized代码块时,这个线程便获得了该对象的锁,其他线程暂时无法访问这个方法,只有等待这个方法执行完毕或者代码块执行完毕,这个线程才会释放该对象的锁,其他线程才能执行这个方法或者代码块。
这个原因很简单,因为一个对象只有一把锁,当一个线程获取了该对象的锁之后,其他线程无法获取该对象的锁,所以无法访问该对象的其他synchronized方法.
当一个线程正在访问一个对象的synchronized方法,那么其他线程能访问该对象的非synchronized方法。
这个原因很简单,访问非synchronized方法不需要获得该对象的锁,假如一个方法没用synchronized关键字修饰,说明它不会使用到临界资源,那么其他线程是可以访问这个方法的,
如果一个线程A需要访问对象object1的synchronized方法fun1,另外一个线程B需要访问对象object2的synchronized方法fun1,即使object1和object2是同一类型),也不会产生线程安全问题,因为他们访问的是不同的对象,所以不存在互斥问题。
如果一个线程执行一个对象的非static synchronized方法,另外一个线程需要执行这个对象所属类的static synchronized方法,此时不会发生互斥现象,因为访问static synchronized方法占用的是类锁,而访问非static synchronized方法占用的是对象锁,所以不存在互斥现象。
获取锁的线程执行完了该代码块,然后线程释放对锁的占有
线程执行发生异常,此时JVM会让线程自动释放锁。
所以:
缺点1:
如果这个获取锁的线程由于要等待IO或者其他原因(比如调用sleep方法)被阻塞了,但是又没有释放锁,其他线程便只能干巴巴地等待。
缺点2:
无法知道线程有没有成功获取到锁。
参考:
http://www.cnblogs.com/dolphin0520/p/3923737.html
互斥锁
能到达到互斥访问目的的锁对象锁
在Java中,每一个对象都拥有一个锁标记(monitor),也称为监视器,多线程同时访问某个对象时,线程只有获取了该对象的锁才能访问。在Java中,可以使用synchronized关键字来标记一个方法或者代码块,当某个线程调用该对象的synchronized方法或者访问synchronized代码块时,这个线程便获得了该对象的锁,其他线程暂时无法访问这个方法,只有等待这个方法执行完毕或者代码块执行完毕,这个线程才会释放该对象的锁,其他线程才能执行这个方法或者代码块。
注意点:
当一个线程正在访问一个对象的synchronized方法,那么其他线程不能访问该对象的其他synchronized方法。这个原因很简单,因为一个对象只有一把锁,当一个线程获取了该对象的锁之后,其他线程无法获取该对象的锁,所以无法访问该对象的其他synchronized方法.
当一个线程正在访问一个对象的synchronized方法,那么其他线程能访问该对象的非synchronized方法。
这个原因很简单,访问非synchronized方法不需要获得该对象的锁,假如一个方法没用synchronized关键字修饰,说明它不会使用到临界资源,那么其他线程是可以访问这个方法的,
如果一个线程A需要访问对象object1的synchronized方法fun1,另外一个线程B需要访问对象object2的synchronized方法fun1,即使object1和object2是同一类型),也不会产生线程安全问题,因为他们访问的是不同的对象,所以不存在互斥问题。
类锁
每个类也会有一个锁,它可以用来控制对static数据成员的并发访问如果一个线程执行一个对象的非static synchronized方法,另外一个线程需要执行这个对象所属类的static synchronized方法,此时不会发生互斥现象,因为访问static synchronized方法占用的是类锁,而访问非static synchronized方法占用的是对象锁,所以不存在互斥现象。
锁释放–死锁问题
对于synchronized方法或者synchronized代码块,当出现异常时,JVM会自动释放当前线程占用的锁,因此不会由于异常导致出现死锁现象。缺点:
释放锁的情况:获取锁的线程执行完了该代码块,然后线程释放对锁的占有
线程执行发生异常,此时JVM会让线程自动释放锁。
所以:
缺点1:
如果这个获取锁的线程由于要等待IO或者其他原因(比如调用sleep方法)被阻塞了,但是又没有释放锁,其他线程便只能干巴巴地等待。
缺点2:
无法知道线程有没有成功获取到锁。
参考:
http://www.cnblogs.com/dolphin0520/p/3923737.html
相关文章推荐
- Java实现拖拽上传(未测试)
- 两个Java项目之间的通信
- struts2学习笔记(一)
- JUnit教程 -- 使用Eclipse的JUnit实例
- Java面向对象:继承
- Java Base64、AES、SHA1、MD5加密算法
- Cannot resolve corresponding JNI function Java_com_xxxx
- spark sql简单示例java
- java自动识别用户上传的文本文件编码(未测试)
- eclipse导出doc文档
- java中HashMap的用法
- 深入剖析Java中的装箱和拆箱
- Java IO 操作(一)
- Java序列化的机制和原理
- JAVA之IO
- JAVA CAS 原理深度分析
- 10046---JSON与JAVA数据的相互转换
- Java7中switch的变动
- Spring 主键序列获取 DataFieldMaxValueIncrementer
- java 接口