线程讲解(十八)
作者:互联网
对象锁
改进后的代码用到了一个对象锁,该对象锁默认是当前对象,上述代码等同于以下代码:
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