设为首页 加入收藏

TOP

java synchronized (一)
2014-11-24 12:02:21 来源: 作者: 【 】 浏览:134
Tags:java synchronized
在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制。
synchronized同步
当使用同步块时,如果方法下的同步块都同步到一个对象上的锁,则所有的任务(线程)只能互斥的进入这些同步块。
举例说明:
1、Test1.java演示了4个线程(包括main线程)试图进入某个类的三个不同的方法的同步块中
线程1调用method1
线程2调用method2
线程3调用method3
main也调用method3
不仅仅线程3和main是互斥的,实际上4个线程都是互斥的,因为他们都同步到了一个对象上(当前对象 synchronized (this)),所以对它们的方法依然是互斥的。
\
2、Test2.java演示了2个线程(包括main线程)试图进入某个类的同一个同步方法中,另外两个线程进入非同步方法。
线程1调用同步方法method1
线程2调用method2
线程3调用method3
main调用同步方法method1
线程1和main是互斥的,
如果先启动线程1,则线程1,线程2,线程3是独立进行的。执行完线程1,才会执行main
如果先启动线程main,则main,线程2,线程3是独立进行的。执行完main,才会执行线程1
3、Test3.java演示了三个线程试图进入某个类的三个不同的方法的同步块中,这些同步块处在不同的方法中,并且是同步到三个不同的对象(synchronized (obj1),synchronized(obj2),synchronized (obj3)),所以这三个线程是独立进行的,并不是互斥的。
[java]
package com.jialin;
/**
* 抽象测试类
* @author jialin
*
*/
public abstract class AbstractTest {
public void Method1()
{}
public void Method2()
{}
public void Method3()
{}
}
package com.jialin;
/**
* 抽象测试类
* @author jialin
*
*/
public abstract class AbstractTest {
public void Method1()
{}
public void Method2()
{}
public void Method3()
{}
}
[java]
package com.jialin;
import java.util.concurrent.TimeUnit;
/**
* 测试java 锁
* @author jialin
*
*/
public class Test1 extends AbstractTest{
public void Method1() {
//-----这一部分未加锁,可以运行到------begin---
System.out.println(Thread.currentThread().getName()
+ ":not synchronized part in Method1()");
//-----这一部分未加锁,可以运行到------end---
synchronized (this) {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()
+ ":synchronized in Method1("+i+")");
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void Method2() {
//-----这一部分未加锁,可以运行到------begin---
System.out.println(Thread.currentThread().getName()
+ ":not synchronized part in Method2()");
//-----这一部分未加锁,可以运行到------end---
synchronized (this) {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()
+ ":synchronized in Method2("+i+")");
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void Method3() {
//-----这一部分未加锁,可以运行到------begin---
System.out.println(Thread.currentThread().getName()
+ ":not synchronized part in Method3()");
//-----这一部分未加锁,可以运行到------end---
synchronized (this) {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()
首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇获取系统中所有应用的方法 下一篇实现通用的PreparedStatement插入..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: