一 简介
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类对象,所以就产生了两个锁。