//synchronized的作用 只能有一个线程执行该synchronized块
//synchronized块之外的其他代码是可以被多个线程同时访问到的
//★1 和 ★2 区块 选择一个执行 对比能够体现出 synchronized 的作用
//synchronized块之外的其他代码是可以被多个线程同时访问到的
//★1 和 ★2 区块 选择一个执行 对比能够体现出 synchronized 的作用
在 Eclipse中 Ctrl+Shift+/ ---->添加 /**/注释 Ctrl+Shift+\ 取消/**/注释
public class Test1 {
public static int count = 0;
public static void inc(int threadNumber) {
//这里延迟1毫秒,使得结果明显
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
/* //★1没有被synchronized区块保护 能被多个线程同时访问 会造成 count++ 之前的数值 和之后的数值 不是偏差1
System.out.println("线程:" + threadNumber+" count++ 之前:"+count );
count++;
System.out.println("线程:" + threadNumber+" count++ 之后:"+count );
*/
//★2 能被多个线程打印出来 但是下面的synchronized区块只能一个线程访问 所以存在线程在这里排队的情况
System.out.println("我是线程:" + threadNumber);// 这里没有被synchronized区块保护 能查看到排列的线程 进程执行到这里 排队等待
synchronized (Test1.class) {
// synchronized区块保护的话 只有一个线程能访问变量 count 必须排队访问 count的值被依次增加 偏差一定是1
System.out.println("线程:" + threadNumber+" count++ 之前:"+count );
count++;
System.out.println("线程:" + threadNumber+" count++ 之后:"+count );
}
}
public static void main(String[] args) {
//同时启动1000个线程,去进行i++计算,看看实际结果 count 是否是连续增加
Test1 test1 = new Test1();
for (int i = 0; i < 1000; i++) {
Task t = test1.new Task(i);
new Thread(t).start();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.out.println("main 最终运行结果:Counter.count=" + Test1.count);
}
class Task implements Runnable{
int Threadnumber;
public Task(int i) {
Threadnumber = i;
}
@Override
public void run() {
Test1.inc(Threadnumber);
}
};
}
★1 没有 synchronized 保护执行的结果如下
线程访问前后偏差不为1
★2 有 synchronized 保护执行的结果如下
能看到线程阻塞 排队执行 每次执行的结果 count前后偏差为1