介绍
sychronized 保证同一时刻某个对象只能被一个线程使用(only one!!),从而保证数据安全。
实战操作一
Test类中有sychronized方法funcA和funcB,线程t1执行funcA,线程t2执行funcB,两个线程共享同一个Test实例对象。那么funcA在执行的过程,是否可以启动funB呢。
**public class Main {
public static void main(String[] args) {
final Test test = new Test();
//线程执行funcA
new Thread(new Runnable() {
public void run() {
test.funcA();
}
}).start();
//线程执行funcB
for (int i = 0;i<10;i++)
new Thread(new Runnable() {
public void run() {
test.funcB();
}
}).start();
}
}
class Test {
public Test(){}
public synchronized void funcA() {
System.out.println("funcA执行,开始。。。");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("funcA执行,结束!");
}
public synchronized void funcB() {
System.out.println("funcB执行");
}
}**
执行结果:
结论:
当一个线程访问object的一个synchronized同步代码块时,另一个线程是不可以访问该object中的另外一个synchronized同步代码块,但可可以访问非synchronized同步代码块。