将分为两篇文章介绍synchronized,分为同步方法和同步代码块,所以分两部分进行介绍。
(1) synchronized同步方法
一 简介
Java并发编程这个领域中synchronized关键字一直都是元老级的角色,被称为“重量级锁”。但是,在JavaSE1.6之后进行了主要包括为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁以及其他各种优化之后变得在某些情况下并不是那么重了。
这一篇不会介绍synchronized关键字的实现原理,更多的是synchronized关键字的使用。
二 变量安全性
”非线程安全“ 问题存在于实例变量中,如果是方法内部的私有变量,则不存在非线程安全问题,所以结果也就是”线程安全“的了。
如果两个线程同时操作对象中的实例变量,则会出现非线程安全,解决的办法就是在方法上加上synchronized关键字即可。
三 多个对象多个锁
先看例子:
public class HasSelfPrivateNum {
private int num = 0;
synchronized public void addI(String username) {
try {
if (username.equals("a")) {
num = 100;
System.out.println("a set over!");
//如果去掉hread.sleep(2000),那么运行结果就会显示为同步的效果
Thread.sleep(2000);
} else {
num = 200;
System.out.println("b set over!");
}
System.out.println(username + " num=" + num);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class ThreadA extends Thread {
private HasSelfPrivateNum numRef;
public ThreadA(HasSelfPrivateNum numRef) {
super();
this.numRef = numRef;
}
@Override
public void run() {
super.run();
numRef.addI("a");
}
}
public class ThreadB extends Thread {
private HasSelfPrivateNum numRef;
publi