java线程概念中的多线程同步
当我试图执行这段代码时,我会得到类似12221121212121221212
的输出。当我将该方法声明为synchronized
时,它不应该允许另一个线程接管该控件
package com.test;
public class TestProject extends Thread {
public void run() {
synchronized (this) {
for (int i = 0; i < 10; i++) {
System.out.print(getName());
}
}
}
public static void main(String[] args) throws InterruptedException {
TestProject myProject = new TestProject();
TestProject myProject1 = new TestProject();
myProject.setName("1");
myProject1.setName("2");
myProject.start();
myProacject1.start();
}
}
那么,我如何修改代码以获得顺序格式的1111111 22222222或2222222 1111111111输出
# 1 楼答案
以下是可以用来实现线程间同步的方法
1)。使用静态全局锁,并将该对象变量作为参数传递给同步块
2)。使用join()
3)。为Object类创建一个实例,并将其作为参数传递给同步块,如下
Object myObject = TestProject.class
现在将myObject传递给同步块使用上述任何一种方法,我们都可以实现同步
# 2 楼答案
您正在
this
上同步,即在TestProject
对象上同步。因为有两个独立的对象,所以有两个独立的锁。因此,无论另一个线程在做什么,这两个线程都可以进入synchronized
部分要跨
TestProject
的实例同步,需要一个静态锁: