【发布时间】:2020-03-25 00:11:37
【问题描述】:
我是 Concurrency 的新手,我正在尝试理解同步块:
public static int count1 = 0;
public static Object lock1 = new Object();
public static void add(){
synchronized (lock1) {
count1++;
}
}
我的问题是lock1,它不起作用,当方法开始打印颜色时,它会随机打印它们,所以我认为问题出在同步块中,因为我看了一些关于这个的教程,他们都说锁定对象必须是静态的,所以不会发生干扰,但在这里我看不到,为什么?
这是打印每个线程颜色的方法:
public static void compute(){
String color = null;
switch (Thread.currentThread().getName()) {
case "First Count Down":
color = TextColors.ANSI_YELLOW;
break;
case "Second Count Down":
color = TextColors.ANSI_MAGENTA;
break;
}
for (int i=0;i<100;i++) {
System.out.println(color + Thread.currentThread().getName() + "is Running");
//add();
add();
}
}
这是线程:
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
compute();
}
});
t1.setName("First Count Down");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
compute();
}
});
t2.setName("Second Count Down");
t1.start();
t2.start();
try{
t1.join();
t2.join();
}catch (InterruptedException io){
io.printStackTrace();
}
System.out.println("Count1 = " + count1 + " Count2 = " + count2);
}
对不起,如果我的英语不好,我不是母语人士,提前谢谢
【问题讨论】:
-
“锁不工作”和“随机打印”是什么意思?你希望这个程序做什么?
-
synchronized块只防止多个线程同时执行count1++;语句,但是锁在块结束时释放,所以没有什么可以防止多线程交替调用add()。如果您希望线程在for循环期间拥有独占访问权限,则需要synchronized块来覆盖循环。 -
另见answer
-
如果你不想让它“随机”,你为什么要使用线程?
count2是什么? -
在这里有一个更直接的问题会很有帮助。当您说“随机打印”和“锁定不起作用”的意思时,更多地解释您的期望以及这里的输出也会更加清晰。
标签: java multithreading synchronization locking synchronized