• 让天下没有难学的技术
    多数学员都来自推荐,这就是口碑的力量

Synchronized关键字锁多个对象

一 简介
synchronized是一种独占锁,也是悲观锁。

在JavaSE 1.6之后进行了主要包括为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁以及其它各种优化之后变得在某些情况下并不是那么重了。

二 synchronized锁多个对象
先看例子:

HasSelfPrivateNum.java

public class HasSelfPrivateNum {

private int num = 0;

public synchronized void addName(String username) {
try {
if (username.equals(“a”)) {
num = 100;
System.out.println(“a set over!”);
Thread.sleep(2000);//如果去掉thread.sleep(2000),那么运行结果就会显示为同步的效果
} else {
num = 200;
System.out.println(“b set over!”);
}
System.out.println(username + ” num=” + num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
HasSelfPrivateNum hasSelfPrivateNum = new HasSelfPrivateNum();
HasSelfPrivateNum hasSelfPrivateNum1 = new HasSelfPrivateNum();
ThreadA threadA = new ThreadA(hasSelfPrivateNum);
ThreadB threadB = new ThreadB(hasSelfPrivateNum1);
threadA.start();
threadB.start();
}
}

ThreadA.java

public class ThreadA extends Thread {
private HasSelfPrivateNum hasSelfPrivateNum;

public ThreadA(HasSelfPrivateNum hasSelfPrivateNum) {
super();
this.hasSelfPrivateNum = hasSelfPrivateNum;
}

@Override
public void run() {
hasSelfPrivateNum.addName(“a”);
}
}

ThreadB.java

public class ThreadB extends Thread {

private HasSelfPrivateNum hasSelfPrivateNum;

public ThreadB(HasSelfPrivateNum hasSelfPrivateNum) {
this.hasSelfPrivateNum = hasSelfPrivateNum;
}

@Override
public void run() {
hasSelfPrivateNum.addName(“b”);
}
}

运行结果:

a set over!
b set over!
b num=200
a num=100

a num=100停顿一会才执行

因为synchronized锁的对象,哪个线程先执行带synchronized关键字的方法,就持有该方法所属对象的锁,其他线程只能等待,多个线程访问的是同一个对象。以上代码中创建了两个HasSelfPrivateNum类对象,所以就产生了两个锁。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注