其他分享
首页 > 其他分享> > 线程讲解(十八)

线程讲解(十八)

作者:互联网

对象锁

改进后的代码用到了一个对象锁,该对象锁默认是当前对象,上述代码等同于以下代码:

protected void numberOff() {
	synchronized (this) {
		for (int i = 0; i < 5; i++) {
			num++;
			System.out.println(Thread.currentThread().getName() + ":" + SynchronizedExample.num);
		}
	}
}

当多个线程用一个对象锁,各个线程可以达到同步的作用,如果每个线程都用自己的对象锁,那么synchronized就失去了同步的作用。如以下代码:

class SynchronizedExample {
	protected static int num = 0;
	protected void numberOff() {
		synchronized (this) {
			for (int i = 0; i < 5; i++) {
				num++;
			System.out.println(Thread.currentThread().getName() + ":" + SynchronizedExample.num);
			}
		}
	}
}
public class SynchronizedTest {
	public static void main(String[] args) throws InterruptedException {
		SynchronizedExample se = new SynchronizedExample();
		for(int i=1; i<=3; i++) {
			new Thread( ()->  {new SynchronizedExample().numberOff();}, "队列"+i).start();
		}
	}
}

执行结果如下:
线程1:1线程2:2线程1:3线程3:4.......

有读者会说不同线程执行的是不同对象中的方法,肯定达不到同步的效果,也对,也很有道理,接着看如下代码:

class SynchronizedExample {
	protected static int num = 0;
	protected void numberOff(Object lock) {
		synchronized (lock) {
			for (int i = 0; i < 5; i++) {
				num++;
			System.out.println(Thread.currentThread().getName() + ":" + SynchronizedExample.num);
			}
		}
	}
}

public class SynchronizedTest {
	public static void main(String[] args) throws InterruptedException {
		SynchronizedExample se = new SynchronizedExample();
		for(int i=1; i<=3; i++) {
			new Thread( ()->  {se.numberOff(new Object());}, "队列"+i).start();
		}
	}
}

执行结果如下:
线程1:1线程2:2线程1:3线程3:4.......

类锁

对于上述问题,读者应该得出一个结论,要想达到同步的效果,必须用同一个锁,此时类锁可以粉末登场。看如下代码:

protected void numberOff(Object lock) {
	synchronized (SynchronizedExample.class) {
		for (int i = 0; i < 5; i++) {
			num++;
			System.out.println(Thread.currentThread().getName() + ":" + SynchronizedExample.num);
		}
	}
}

上述代码可以达到同步的效果。

标签:SynchronizedExample,int,十八,numberOff,++,num,线程,讲解
来源: https://blog.csdn.net/qq_44863814/article/details/121011574