Cam*_*Cam 6 java multithreading synchronized
我是多线程的新手,我编写了这段代码,它通过同时运行线程递增并打印变量来打印数字1-10000.
这是我正在使用的代码:
package threadtest;
public class Main{
static int i=0;
static Object lock=new Object();
private static class Incrementer extends Thread{
@Override
public void run(){
while (true){
synchronized(lock){
if (i>=10000)
break;
i++;
System.out.println(i);
}
}
}
}
public static void main(String[] args) {
new Incrementer().start();
new Incrementer().start();
new Incrementer().start();
new Incrementer().start();
new Incrementer().start();
new Incrementer().start();
}
}
Run Code Online (Sandbox Code Playgroud)
这工作 - 我写了一个测试程序来检查输出,打印的数字按顺序正好是1-10000.
我的问题是:我听说这synchronized只是语法糖.但是,如果不使用它,我似乎无法取得成功.我错过了什么?
JUS*_*ION 14
synchronized什么都不是语法糖.如果不使用synchronized关键字,就无法在Java中使用锁.
在Java中锁定中存在一种"语法糖"的地方synchronized可以应用于块(如上所述)和整个方法.以下两种方法在语义上大致相同:
synchronized void method1() {
// ... do stuff ...
}
void method2() {
synchronized(this) {
// ... do stuff ...
}
}
Run Code Online (Sandbox Code Playgroud)
那你为什么要做第二个版本而不是第一个呢?
this锁定之外的对象,这为您提供了更灵活的锁定语义.