synchronize:并发编程中的元老级角色,jdk1.6之前的由于上锁的操作的性能开销太大,所以这种锁又叫做重量级锁,之后jdk1.6以后引入偏 向锁和轻量级锁对其进行了一系列的优化。
synchronize可以锁的对象包括:成员方法,静态方法,代码块(类对象,调用该方法的对象this,对象)
锁机制就是一个标志位,用0或者1表示对象是否被线程使用映射到锁机制就是是否上了锁。
sychronized锁在成员方法上,相当于锁在this上面,锁在静态方法上相当于所在.class文件上。
synchronized关键字的使用,并且注意锁静态方法与锁成员方法的区别
package com.ydlclass.lock;
public class SynchronizedLock {
public static final Object MONITOR = new Object();//只要这个对象,每个线程都能访问到,由于是静态的,使用这种方式代替sychronized(.class)
public synchronized void say1() throws InterruptedException {
Thread.sleep(200);
System.out.println("say1");
//如果想锁this,可以使用这种方式
//在成员方法中sychronized(this){}
}
public static synchronized void say2() throws InterruptedException {//加上synchronized,线程回一次调用这个方法;
//如果去掉,那么可能回一次直接输出,并且可能是乱序的
Thread.sleep(200);
System.out.println("say2");
}
public static void main(String[] args) {
for (int i = 0; i < 50; i++) {
new Thread(()->{
try {
//new SynchronizedLock().say1();//say1不会被锁住,原因不同的对象,所以不是一把锁,所以不能
say2();
System.out.println("_____" + Math.random() + "______");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
// for (int i = 0; i < 50; i++) {
// new Thread(()->{
// synchronized (MONITOR) {
// try {
// Thread.sleep(200);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// System.out.println(2);
// System.out.println("___" + Math.random() + "___");
// }
// }).start();
}
}
}