Yuv*_*evy 0 java multithreading synchronized
考虑以下代码:
public class Main {
public static void main(String[] args){
MyObject obj = new MyObject();
Thread1 t1 = new Thread1(100,'#',obj);
Thread1 t2 = new Thread1(100,'*',obj);
t1.start();
t2.start();
}
}
Run Code Online (Sandbox Code Playgroud)
public class Thread1 extends Thread {
int myNum;
char myChar;
MyObject myObj;
public Thread1(int num, char c, MyObject obj){
myNum = num;
myChar = c;
myObj = obj;
}
public synchronized void run(){
for(int i = 1; i<myNum; i++){
if((i%10)==0)
System.out.println("");
System.out.print(myChar);
}
}
}
Run Code Online (Sandbox Code Playgroud)
MyObject类是空类,没有任何空间.我的问题是,为什么同步不起作用,我同时以随机顺序打印'#'和' '而不是一个接一个地打印?
同步锁定对象的监视器.在你的情况,你是对同步每个线程对象,这是线程反对对线程B的监视线程的监视和线程B锁一锁.因此他们没有互动.
我认为你的run()方法意味着以下内容:
public void run(){
synchronized (myObj) {
for(int i = 1; i<myNum; i++){
if((i%10)==0)
System.out.println("");
System.out.print(myChar);
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果这确实是你对myObj的预期用途,那么我也会建议以下改变; 因为它有助于使代码更具可读性.
更改:
MyObject myObj;
Run Code Online (Sandbox Code Playgroud)
至:
private final MyObject lock;
Run Code Online (Sandbox Code Playgroud)
编辑一种替代方法,它不会锁定myObj,而是锁定Thread1的Class实例.
public void run(){
doJob();
}
private static synchronized void doJob() {
for(int i = 1; i<myNum; i++){
if((i%10)==0)
System.out.println("");
System.out.print(myChar);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
69 次 |
| 最近记录: |