什么是同步代码块:
同步代码块是共用同一把锁的代码块,使用同步代码块可以实现两块代码在执行过程中互斥。
即执行代码块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();
}
}
}
执行结果:


本文深入解析了同步代码块的概念及其实现方式,通过使用静态对象锁确保代码块在多线程环境下的互斥执行,避免了并发冲突。文章提供了具体的Java代码示例,展示了如何在两个方法中使用同一把锁,使它们在执行时不会相互干扰。
9364

被折叠的 条评论
为什么被折叠?



