论坛首页 Java企业应用论坛

同一任务和对象锁的问题

浏览 13692 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (9) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-08-04  
感觉应该是这样的,当执行synchronized方法的时候,先判断该线程是否拥有锁,如果没有锁则获取锁。如果已经拥有了则执行。
0 请登录后投票
   发表时间:2010-08-05  
public class SynchronizedClassHolder {

	public static void main(String[] args) {
		new Thread("thread 1") {
			public void run() {
				new SynchronizedClassHolder().f1();
			}
		}.start();

		new Thread("thread 2") {
			public void run() {
				new SynchronizedClassHolder().f1();
			}
		}.start();
	}

	private static int count = 10;

	public synchronized void f1() {
		if (--count > 0) {
			System.out.println(Thread.currentThread().getName()
					+ "    f1() calling f2() count " + count);
			f2();
		}
	}

	public synchronized void f2() {
		if (--count > 0) {
			System.out.println(Thread.currentThread().getName()
					+ "    f2() calling f1() count " + count);
			f1();
		}
	}
}




显示的结果:


thread 1    f1() calling f2() count 9
thread 2    f1() calling f2() count 8
thread 2    f2() calling f1() count 6
thread 2    f1() calling f2() count 5
thread 2    f2() calling f1() count 4
thread 2    f1() calling f2() count 3
thread 2    f2() calling f1() count 2
thread 1    f2() calling f1() count 7
thread 2    f1() calling f2() count 1



这个怎么解释呢?
jvm 1.6.0.18
0 请登录后投票
   发表时间:2010-08-05  
是不是说 ,在从f1调用f2的时候,出现的释放+重新获取的动作呢?
0 请登录后投票
   发表时间:2010-08-05  
对象锁 分持有 和 非持有,持有状态有有不同情况,访问一个同步方法则指数加一,反之减一,所以当一个任务持有对象锁之后再次访问该对象的的同步方法则指数加一,不会死锁。
0 请登录后投票
   发表时间:2010-08-05  
whoamiwangwb 写道
是不是说 ,在从f1调用f2的时候,出现的释放+重新获取的动作呢?



没有,代码中没有wait这样的操作,不会出现释放锁的行为。
0 请登录后投票
   发表时间:2010-08-05  
就是由编译器搞的互斥量或二元信号量,看JAVA里面的描述想理解这个话题,说心里话,很难。
0 请登录后投票
   发表时间:2010-08-05  
whoamiwangwb 写道
public class SynchronizedClassHolder {

	public static void main(String[] args) {
		new Thread("thread 1") {
			public void run() {
				new SynchronizedClassHolder().f1();
			}
		}.start();

		new Thread("thread 2") {
			public void run() {
				new SynchronizedClassHolder().f1();
			}
		}.start();
	}

	private static int count = 10;

	public synchronized void f1() {
		if (--count > 0) {
			System.out.println(Thread.currentThread().getName()
					+ "    f1() calling f2() count " + count);
			f2();
		}
	}

	public synchronized void f2() {
		if (--count > 0) {
			System.out.println(Thread.currentThread().getName()
					+ "    f2() calling f1() count " + count);
			f1();
		}
	}
}




显示的结果:


thread 1    f1() calling f2() count 9
thread 2    f1() calling f2() count 8
thread 2    f2() calling f1() count 6
thread 2    f1() calling f2() count 5
thread 2    f2() calling f1() count 4
thread 2    f1() calling f2() count 3
thread 2    f2() calling f1() count 2
thread 1    f2() calling f1() count 7
thread 2    f1() calling f2() count 1



这个怎么解释呢?
jvm 1.6.0.18


你这个程序根本没有同步,两个线程都是只对自己的SynchronizedClassHolder加锁,synchronized根本没有意义
0 请登录后投票
   发表时间:2010-08-06  
whoamiwangwb 写道
public class SynchronizedClassHolder {

	public static void main(String[] args) {
		new Thread("thread 1") {
			public void run() {
				new SynchronizedClassHolder().f1();
			}
		}.start();

		new Thread("thread 2") {
			public void run() {
				new SynchronizedClassHolder().f1();
			}
		}.start();
	}

	private static int count = 10;

	public synchronized void f1() {
		if (--count > 0) {
			System.out.println(Thread.currentThread().getName()
					+ "    f1() calling f2() count " + count);
			f2();
		}
	}

	public synchronized void f2() {
		if (--count > 0) {
			System.out.println(Thread.currentThread().getName()
					+ "    f2() calling f1() count " + count);
			f1();
		}
	}
}




显示的结果:


thread 1    f1() calling f2() count 9
thread 2    f1() calling f2() count 8
thread 2    f2() calling f1() count 6
thread 2    f1() calling f2() count 5
thread 2    f2() calling f1() count 4
thread 2    f1() calling f2() count 3
thread 2    f2() calling f1() count 2
thread 1    f2() calling f1() count 7
thread 2    f1() calling f2() count 1



这个怎么解释呢?
jvm 1.6.0.18


两回事情,请看看楼主的问题哦。呵呵
当多个线程使用同一个对象调用此对象的同步方法时才需要竞争(当前)对象锁,此时同步才有意义;现在的问题是两个线程使用各自的对象调用各自对象的同步方法了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics