synchronized同步代码块的使用场景 (满足以下两种条件,就要考虑使用synchronize同步代码块了)
1.被synchronized同步代码块{同步的代码},是被多次异步调用,什么叫多次异步调用? 例如:多线程,........(例如:getValue())
1.多次异步调用之--多线程案例:
package android.java.thread09;
public class Test5 implements Runnable {
// 共享数据
int sum = 8;
@Override
public void run() {
while (true) {
synchronized (Test5.class) {
if (sum > 0) {
System.out.println("sum:" + sum);
sum -- ;
}
}
}
}
public static void main(String[] args) {
/**
* 定义Runnable实现类Test5,此实现类Test5不是线程,此实现类Test5给四个Thread去执行的
*/
Runnable test5 = new Test5();
// 实例化线程对象
Thread thread1 = new Thread(test5); // 此实现类Test5给Thread去执行的
Thread thread2 = new Thread(test5); // 此实现类Test5给Thread去执行的
Thread thread3 = new Thread(test5); // 此实现类Test5给Thread去执行的
Thread thread4 = new Thread(test5); // 此实现类Test5给Thread去执行的
// 开启启动线程
thread1.start(); // 启动第Thread-0线程
thread2.start(); // 启动第Thread-1线程
thread3.start(); // 启动第Thread-2线程
thread4.start(); // 启动第Thread-3线程
// 以上开启了四个线程 属于多线程了
}
}
2.多次异步调用之--方法被其他地方多次调用
package android.java.thread09;
public class Test6 {
public synchronized int getValue() {
int count = 0 /* 假设有着具体负责也业务逻辑运算取值等操作 */;
// ......
return 0;
}
}
属于多次异步调用
例如:getValue(); 会被很多地方调用,是不是有可能出现同时调用的,就会出现安全问题,所以安全问题不仅仅出现在多线程,还出现在这种情况
2.多线程或......只持有一把锁