mk.*_*mk. 12
这些用于构建具有许多"线程"的程序时.当main启动时,它以一个线程开始,该线程按顺序执行步骤.您可以启动更多线程,然后可以同时执行代码.如果您同时执行相同的代码,事情可能会以您不想要的方式运行:
y = x+20;
// at this moment, before the next instruction starts, some other thread performs
// the above step, which sets 'y' (an object property) to something different.
int b = y+10; // this would not be x+20, as you might expect.
Run Code Online (Sandbox Code Playgroud)
你想要做的是对这段代码进行"锁定",以确保没有其他线程可以开始执行任何与变量y"同步"的代码.
synchronized (y) {
y = x+20;
int b = y+10;
} // lock gets released here
Run Code Online (Sandbox Code Playgroud)
现在,所有其他线程必须等待先到达该块的任何线程退出块并释放锁,此时另一个线程抓取锁,进入代码块,执行它并释放锁.注意,y必须是对象(整数),而不是基本类型.
您还可以将"synchronized"添加到方法,这些方法在"this"(实例对象)上进行同步,或者在静态方法的情况下进行同步.
编写多线程代码很难,因为这样的问题.同步是一个工具,虽然它有一个主要问题 - 死锁.网上有很多关于死锁的信息.