什么是同步代码块:
同步代码块是共用同一把锁的代码块,使用同步代码块可以实现两块代码在执行过程中互斥。
即执行代码块A的时候不执行代码块B,执行代码块B的时候不执行代码块A。
实现方法:
使用静态对象锁。
private static final Object SYNCHRONIZED_OBJECT = new Object();
举个栗子:
public class LockDemo{
/**
* 静态对象锁
*/
private static final Object SYNCHRONIZED_OBJECT = new Object();
public void method1() {
synchronized (SYNCHRONIZED_OBJECT) {
System.out.println("method1 start");
for (int i=1;i<=4;i++) {
System.out.println("method1:"+i);
try {
Thread.sleep(1000);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
System.out.println("method1 end");
}
}
public void method2() {
synchronized (SYNCHRONIZED_OBJECT) {
System.out.println("method2 start");
for (int i=1;i<=4;i++) {
System.out.println("method2:"+i);
try {
Thread.sleep(1000);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
System.out.println("method2 end");
}
}
}
public class TestDemo {
/**
* 两个对象共用同一把静态对象锁,分别启用两个线程来执行这两个对象的不同方法,可见两个代码块互斥
*/
@Test
public void test1() {
LockDemo lockDemo1 = new LockDemo();
LockDemo lockDemo2 = new LockDemo();
ThreadDemo demo1 = new ThreadDemo(lockDemo1,"method1");
ThreadDemo demo2 = new ThreadDemo(lockDemo2,"method2");
demo2.start();
demo1.start();
try {
demo1.join();
demo2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 线程例子
*/
class ThreadDemo extends Thread{
LockDemo lockDemo;
String method;
ThreadDemo(LockDemo lockDemo,String method) {
this.lockDemo = lockDemo;
this.method = method;
}
@Override
public void run() {
if (method.equals("method1")) {
lockDemo.method1();
} else {
lockDemo.method2();
}
}
}