在网上看了许多关于synchronized的介绍及用法区别,大多大同小异,点到为止,个人推荐一篇博友写的,
网址如下:http://blog.csdn.net/cs408/article/details/48930803
这篇博客是介绍对象锁和类锁的区别,通俗易懂,而我的这篇博客是基于此基础上引申出,用实际的代码分析对象和类在方法、代码段加锁及静态时的对比。
开始先普及一下java里synchronized锁的一些概念:有分为对象锁和类锁两种。对象锁(又称作实例锁),是指锁在某一个实例对象上的;类锁(又称作全局锁),是锁针对类上的,无论实例多少该类对象,都是共享该锁。
一、首先是这样一个列子,设计一个多线程的类TestSynchronized,有如下方法:
class TestSynchronized{
public synchronized void test_one(){ //加锁的实例方法
System.out.println(Thread.currentThread().getName()+" begin time: "+System.currentTimeMillis());
//记录某线程进入此方法时的时间
try{
Thread.sleep(1000); //某线程睡眠1秒
}catch (Exception e) {}
System.out.println(Thread.currentThread().getName()+" end time: "+System.currentTimeMillis());
//记录某线程结束此方法时的时间
}
public synchronized void test_one_cope(){ //加锁的实例方法
//内容同上方法内....
}
public static synchronized void test_two(){ //加锁的类方法
//内容同上方法内....
}
public static synchronized void test_two_cope(){ //加锁的类方法
//内容同上方法内....
}
}
在主函数测试中,给每个方法对应一个线程:
Thread thread = new Thread( //一个线程测一个方法
new Runnable() {
public void run() {
//test(); //方法名
}
}
);
thread.setName("..."); //给线程添加名字,便于结果读取
新建两个TestSynchronized对象A和B,有如下对比:
测试序号 | 对象 | 静态 | 加锁方法 | 对象 | 静态 | 加锁方法 |
1 | A | × | test_one() | A | × | test_one_cope() |
2 | A | × | test_one() | B | × | test_one() |
3 | A | × | test_one() | A | √ | test_two() |
4 | A | √ | test_two() | B | √ | test_two() |
5 |