前言:处理简单的并发可以给对象加把锁,防止不同线程对同一资源同时进行操作,但是也需要谨慎使用"synchronized "关键字。
1、同步锁
package com.boonya.concurrent;
/**
* Java同步锁
*
* @author BOONYACHENGDU@GMAIL.COM 熟悉一下Synchronized的用法 写法
*/
public class SynchronizedInJava {
/**
* 某线程执行method1()方法,则该对象将加锁。其它线程将无法执行该对象的所有synchronized块。
*/
public synchronized void method1() {
// ....;
}
/**
* 同用法1, 但更能体现synchronized用法的本质。
*/
public void method2() {
// 锁住本对象
synchronized (this) {
// ...;
}
}
/**
* 测试方法3 执行method3(),会给对象a加锁,注意不是给SynchronizedInJava的对象加锁,也就是说 Test
* 对象的其它synchronized方法不会因为method3()而被锁。同步代码块执行完,则释放对a的锁。
*/
private String a = "test";
public void method3() {
// 锁住a对象
synchronized (a) {
// ...;
}
}
public synchronized void t() {
//这个同步代码块不会因为method3()而锁定.
// ...;
}
/**
* 为了锁住一个对象的代码块而不影响该对象其它 synchronized块的高性能写法
*/
private byte[] lock = new byte[0];
public void method4() {
synchronized (lock) {
// ...;
}
}
public synchronized void td() {
// ...;
}
/**
* 静态方法锁
*/
public synchronized static void execute1() {
// ...;
}
// 效果同上(静态方法锁)
public static void execute2() {
synchronized (SynchronizedInJava.class) {
// ...;
}
}
}
2、死锁
多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 导致死锁的根源在于不适当地运用“synchronized”关键词来管理线程对特定对象的访问。“synchronized”关键词的作用是,确保在某个时刻只有一个线程被允许执行特定的代码块,因此,被允许执行的线程首先必须拥有对变量或对象的排他性的访问权。当线程访问对象时,线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁。 由于这个原因,在使用“synchronized”关键词时,很容易出现两个线程互相等待对方做出某个动作的情形。
package com.boonya.concurrent;
/**
* 模拟死锁出现的情景
*
* @author BOONYACHENGDU@GMAIL.COM 假设先调用 method1()
* 首先lock_1对象被锁住,lock_2被锁住,lock_1直到lock_2执行完成后方才解锁;
* 在method1执行的间隙,method2()被调用,由于lock_1、lock_2被锁定,造成线程阻塞,产生死锁。
*/
public class SynchronizedDeadlocker {
int field_1;
private Object lock_1 = new int[1];
int field_2;
private Object lock_2 = new int[1];
public void method1(int value) {
synchronized (lock_1) {
synchronized (lock_2) {
field_1 = 0;
field_2 = 0;
}
}
}
public void method2(int value) {
synchronized (lock_2) {
synchronized (lock_1) {
field_1 = 0;
field_2 = 0;
}
}
}
}
注:在实际生产环境中还是要考虑是否会产生死锁,避免灾难的发生。
参考资源:http://dapple.iteye.com/blog/787563
分享到:
相关推荐
深入java并发编程,使用ReentrantLock和 Synchronized加锁
Java分布式应用学习笔记06浅谈并发加锁机制分析
主要介绍了java synchronized加载加锁-线程可重入详解及实例代码的相关资料,需要的朋友可以参考下
Java并发编程系列- synchronized;Java并发编程系列- synchronized;Java并发编程系列- synchronized;
基于Synchronized加锁的四个demo,主要反映类锁、对象锁、方法锁的使用方法。 并测试不同类型锁之间的有效关系。
我自己的博客所附带的案例源码,我的博客标题名称是"synchronized并发讲解",关注我等待跟多更新
synchronized关键字”锁”的实现本质 synchronized关键字实现的锁是依赖于JVM的,...上面这段代码,synchronized锁的其实是 o 这个对象,不是{}里面的代码块,synchronized (o)加锁的过程可以理解为,通过改变o这个对
但是,这个对象所属的 Class 所产生的另一对象 P2 却可以任意调用这个被加了 synchronized 关键字的方法。 在以下代码中: public void methodAAA(){ synchronized (this) { //….. } } this 指的是调用这个...
synchronized的几种示例研究,方法加锁,代码块加锁(this和对象)以及静态方法加锁的示例和效果。基本上包含了synchronized的几种常用的方式。
主要介绍了Java中Synchronized(对象锁)和Static Synchronized(类锁)的区别,希望对大家有所帮助,一起跟随小编过来看看吧
一种显式定义同步锁对象来实现锁,提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock锁。 # synchronized锁与lock锁的对比 Lock是显式锁,需要手动的开启和...
synchronized
主要介绍了Java利用同步块synchronized()保证并发安全,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Java多线程(Synchronized+Volatile+JUC 并发工具原理+线程状态+CAS+线程池)
Java并发编程---synchronized关键
并发编程关键字
其次,从功能特性上来看,synchronized具有可重入性,即同一个线程可以多次获取同一个对象的锁,而不会导致死锁。而Lock接口也提供了可重入锁的实现。此外,Lock接口还提供了更灵活的锁获取方式,如可以尝试获取锁...
2. 聊聊并发(二)Java SE1.6中的Synchronized 3. 聊聊并发(三)Java线程池的分析和使用 4. 聊聊并发(四)深入分析ConcurrentHashMap 5. 聊聊并发(五)原子操作的实现原理 6. 聊聊并发(六)...
本文的主题是关于具有java语言风格的Thread、synchronized、volatile,以及J2SE5中新增的概念,如锁(Lock)、原子性(Atomics)、并发集合类、线程协作摘要、Executors。开发者通过这些基础的接口可以构建高并发、线程...
主要总结了:本地内存和线程安全的问题、volatile、synchronized、处理器实现并发的方式、Java实现并发的方式。