正确理解Java中的多线程多Synchronized对我们学习多线程编程非常重要,下面的测试程序阐述了Java对象锁的特性,例子如下
Coding:
/**
* 该例子程序是为了理解Java线程里面提供的同步关键字 synchronized 对象锁 synchronized
* 获取的是对象锁,我们可以理解为对象的锁就一把,一旦一根线程获取之后另外一根线程就只能等待 以下的模拟是:
*
* 当一根线程进入一个对象的synchrozied方法之后,另外的线程将无法同时在进入该
* 对象其它的synchronized方法,但是可以进入该对象的其它非synchronized
*
* 测试注意事项:
* <li>1、由于线程执行的随机性,只要获取到锁的线程进入睡眠状态则其它线程就不能在其释放锁之前进入其它的同步方法</li>
* <li>2、当狗开始叫先执行,那么吃的执行就会一直要等到叫执行完之后才能执行,而摇尾巴的方法不会受到锁的限制</li>
* <li>3、调试可以自己修改随意选择一个休眠的线程,然后分析打印结果</li>
*
* @author 吖大哥
* @date Jun 1, 2014 4:43:17 PM
*/
public class ThreadTester {
public static void main(String[] args) {
// 前提同一只狗在同一时刻他的嘴巴只能干一件事,当然你一定要认为它边吃还能边叫,那我也没办法
final DogAction dog = new DogAction("哈士奇0001");
// 狂叫线程
new Thread(new Runnable() {
public void run() {
dog.barking();
}
}).start();
// 狂吃线程
new Thread(new Runnable() {
public void run() {
dog.eating();
}
}).start();
// 狂摇尾巴
new Thread(new Runnable() {
public void run() {
dog.tailing();
}
}).start();
}
}
// 狗的行为类
class DogAction {
private String name;
public DogAction(String name) {
this.name = name;
}
public synchronized void barking() {
try {
System.out.println("----------------已获得锁啦----------------");
Thread.currentThread().sleep(6000);
System.out.println(name + "正在狂叫**************");
System.out.println("----------------已释放锁啦----------------");
} catch (Exception e) {
e.printStackTrace();
}
}
public synchronized void eating() {
try {
// Thread.currentThread().sleep(6000);
System.out.println(name + "正在狂吃**************");
} catch (Exception e) {
e.printStackTrace();
}
}
public void tailing() {
try {
Thread.currentThread().sleep(200);
System.out.println(name + "正在狂摇尾巴**************");
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行结果:
----------------已获得锁啦----------------
哈士奇0001正在狂摇尾巴**************
哈士奇0001正在狂叫**************
----------------已释放锁啦----------------
哈士奇0001正在狂吃**************
执行中截图: