synchronized
用法有三个:
修饰实例方法
修饰静态方法
修饰代码块
1. 修饰实例方法
synchronized
关键词作用在方法的前面,用来锁定方法,其实默认锁定的是this
对象。
public class Thread1 implements Runnable{
//共享资源(临界资源)
static int i=0;
//如果没有synchronized关键字,输出小于20000
public synchronized void increase(){
i++;
}
public void run() {
for(int j=0;j<10000;j++){
increase();
}
}
public static void main(String[] args) throws InterruptedException {
Thread1 t=new Thread1();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();
t2.start();
t1.join();//主线程等待t1执行完毕
t2.join();//主线程等待t2执行完毕
System.out.println(i);
}
}
2. 修饰静态方法
synchronized
还是修饰在方法上,不过修饰的是静态方法,等价于锁定的是Class
对象,
public class Thread1 {
//共享资源(临界资源)
static int i = 0;
//如果没有synchronized关键字,输出小于20000
public static synchronized void increase() {
i++;
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new Runnable() {
public void run() {
for (int j = 0; j < 10000; j++) {
increase();
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for (int j = 0; j < 10000; j++) {
increase();
}
}
});
t1.start();
t2.start();
t1.join();//主线程等待t1执行完毕
t2.join();//主线程等待t2执行完毕
System.out.println(i);
}
}
3. 修饰代码块
用法是在函数体内部对于要修改的参数区间用synchronized
来修饰,相比与锁定函数这个范围更小,可以指定锁定什么对象。
public class Thread1 implements Runnable {
//共享资源(临界资源)
static int i = 0;
@Override
public void run() {
for (int j = 0; j < 10000; j++) {
//获得了String的类锁
synchronized (String.class) {