synchronized 锁
1.锁什么
锁对象
可能锁的对象包括:this , 临界资源对象 (多线程都能访问到的对象), class 类对象。
静态同步方法,锁的是当前类型的类对象。
synchronized (使用范围越小越好)
代码贴图描述:
程序运行内存示意图:
上代码:
扫描二维码关注公众号,回复:
4137215 查看本文章
/**
* synchronized关键字
* 锁对象。synchronized(this)和synchronized方法都是锁当前对象。
*/
package concurrent.t01;
import java.util.concurrent.TimeUnit;
public class Test_01 {
private int count = 0;
private Object o = new Object();
public void testSync1(){
synchronized(o){
System.out.println(Thread.currentThread().getName()
+ " count = " + count++);
}
}
public void testSync2(){
synchronized(this){
System.out.println(Thread.currentThread().getName()
+ " count = " + count++);
}
}
public synchronized void testSync3(){
System.out.println(Thread.currentThread().getName()
+ " count = " + count++);
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
final Test_01 t = new Test_01();
new Thread(new Runnable() {
@Override
public void run() {
t.testSync3();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
t.testSync3();
}
}).start();
}
}
/**
* synchronized关键字
* 同步方法 - static
* 静态同步方法,锁的是当前类型的类对象。在本代码中就是Test_02.class
*/
package concurrent.t01;
import java.util.concurrent.TimeUnit;
public class Test_02 {
private static int staticCount = 0;
public static synchronized void testSync4(){
System.out.println(Thread.currentThread().getName()
+ " staticCount = " + staticCount++);
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void testSync5(){
synchronized(Test_02.class){
System.out.println(Thread.currentThread().getName()
+ " staticCount = " + staticCount++);
}
}
}