synchronizied 修饰实例方法,对当前实例加锁,多线程对同一实例对象进行操作试需要获取锁
public class Synchronized1 implements Runnable{
//共享资源
static int n = 0;
public synchronized void add(){
n++;
}
@Override
public void run() {
for (int i = 0; i < 100000; i++) {
add();
}
}
public static void main(String[] args) throws InterruptedException {
// 对一个实例起多个线程
Synchronized1 obj = new Synchronized1();
Thread t1 = new Thread(obj);
Thread t2 = new Thread(obj);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(n);
}
}
控制台输出
·····························
200000
Process finished with exit code 0
通过对add方法加synchronized关键字,使两个线程在同一时间只能有一个去执行add方法使得输出结果为200000。如果不加锁,由于n++方法是先读取,在计算,后写入,在这个过程中,另一个线程读取到了还没有写入的值,就会导致最终的总数量会小于200000。
当创建多个实例时,synchronized修饰实例方法就会失效。