首先请看下面的例子:
package com.lipeng;
public class SynchronizedDemo {
public static void main(String[] args) {
final Print print=new Print();
for(int i=0;i<1000;i++)
{
new Thread(){
@Override
public void run() {
print.printName("huangfeihong");
}
}.start();
new Thread(){
@Override
public void run() {
print.printName("zhangsanfeng");
}
}.start();
}
}
}
class Print
{
/**
* 打印名字
* @param name
*/
public void printName(String name)
{
for(int i=0;i
{
System.out.print(name.charAt(i));
}
System.out.println();
}
}
例子中,Print类的作用是打印一个名字,但是一个一个字符打印的,主程序中开启两个线程,分别打印
1000次huangfeihong和zhangsanfeng.
结果如下:
以上答案并不是我们期望看到的。那么为什么会出现这种情况呢?
多个线程执行时,CPU对线程的调度是随机的,我们不知道当前程序被执行到哪步就切换到了下一个线程,
一个最经典的例子就是银行汇款问题,一个银行账户存款100,这时一个人从该账户取10元,同时另一个人向该
账户汇10元,那么余额应该还是100。那么此时可能发生这种情况,A线程负责取款,B线程负责汇款,A从主内
存读到100,B从主内存读到100,A执行减10操作,并将数据刷新到主内存,这时主内存数据100-10=90,而B
内存执行加10操作,并将数据刷新到主内存,最后主内存数据100+10=110&#