在下面这段代码中,如果对init方法只加synchronized关键字,则不能达到互斥的目的,还要再加上static关键字才能互斥,为什么? 因为你生成了5个实例每个实例都是独立存在的,互相并不影响,所以非static的init方法就根本不存在同步的问题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public class Synchronized{ public static void main(String[] arg) { A a= new A(); for(int i=0;i<4;i++){ T t = new T(a); t.start(); } }}class T extends Thread{ private A a = null; public T(A a){ this.a = a; } public void run(){ a.init(); }}class A{// private static synchronized void init()// right, synchronized public synchronized void init() // error, no synchronized { System.out.println("step 1"); try{ Thread.sleep(1000); }catch(Exception e) { System.out.println(e.toString()); } System.out.println("step 2"); }}这样就可以了 假如没有加static,互斥锁是针对单个对象的。假如有static,那就是一个互斥锁针对单个类了。在每个A都有一个互斥锁的时候,现在有5个A的实例,每个实例对应一个线程T的实例,注意,这里是一一对应,没有一个A的实例同时被两个T实例访问。因此,不会出现线程之间争用一个互斥锁而造成的等待现象。 I see, thanks everyone. 给定两个字符串s和t,请判断s是否是t的子序列 将一个正整数分解质因数 多线程同步,在WIN 7下调试始终是一个线程在运行,为何? JAVA连接microsoft sql 2000数据库 出现问题,请各位大虾帮忙,急急急!!! 我想对java有更深入的了解 解题||指点||提供资料==绝对有高分!(100%承诺能帮解决重点者200分以上) 请教高手,如何在java中做一个模拟键盘的程序? 散分 求救关于sfv结尾的的文件 Swing中JTable控件的问题! 如何打包? 关于JTree的简单问题
public static void main(String[] arg)
{
A a= new A();
for(int i=0;i<4;i++){
T t = new T(a);
t.start();
}
}
}class T extends Thread
{
private A a = null;
public T(A a){
this.a = a;
}
public void run(){
a.init();
}
}class A{// private static synchronized void init()// right, synchronized
public synchronized void init() // error, no synchronized
{
System.out.println("step 1");
try{
Thread.sleep(1000);
}catch(Exception e) {
System.out.println(e.toString());
}
System.out.println("step 2");
}
}这样就可以了
在每个A都有一个互斥锁的时候,现在有5个A的实例,每个实例对应一个线程T的实例,注意,这里是一一对应,没有一个A的实例同时被两个T实例访问。因此,不会出现线程之间争用一个互斥锁而造成的等待现象。