synchronized 的作用不是在线程访问该类的对象是把对象锁定等该语句执行完了以后才解锁的吗 为什么这样写 输出结果还是同时执行的呢 菜鸟学线程 求高手解答
- Java code
public class TestSynchronized { public static void main(String[] args) { T t1 = new T("t1"); T t2 = new T("t2"); t1.start(); t2.start(); } public void run2() { }}class T extends Thread { private static int num = 0; T(String n) { super(n); } public void run() { synchronized(this) { num++; try { Thread.sleep(1000); } catch(InterruptedException e) {} System.out.println(getName() + "------" + num); } }}
------解决方案--------------------------------------------------------
synchronized(this)锁定的是当前对象
------解决方案--------------------------------------------------------
给了一下,可能是你要的效果
public class TestSynchronized {
public static void main(String[] args) {
TestSynchronized o = new TestSynchronized();
T t1 = new T("t1",o);
T t2 = new T("t2",o);
t1.start();
t2.start();
}
public void run2() {
}
}
class T extends Thread {
private static int num = 0;
TestSynchronized o;
T(String n,TestSynchronized target) {
super(n);
o=target;
}
public void run() {
synchronized(o) {
num++;
try {
Thread.sleep(1000);
} catch(InterruptedException e) {}
System.out.println(getName() + "------" + num);
}
}
}
------解决方案--------------------------------------------------------
你锁住自身有什么用啊....你创建了两个对象,你产生同步的问题是num类变量,不是成员变量,锁住this没用
------解决方案--------------------------------------------------------
你可以试试synchronized(this.getClass())
------解决方案--------------------------------------------------------
汗 你怎么还是锁this 麻烦你锁住变量num可以吗
------解决方案--------------------------------------------------------
synchronized(this) ,lz这样写不对哦
------解决方案--------------------------------------------------------
this指的不是ts,要用this.getClass()。
改成 synchronized(this.getClass()) 即可。
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
LZ要明白一个事情,同步是多个线程共同访问一个相同的资源才有意义的
你的第一次写法,syncrhonized(this)就是每个线程自己锁自己(和别的线程没有任何干涉),所以达不到同步的效果
- Java code
public class TestSync implements Runnable { Timer timer = new Timer(); public static void main(String[] args) { TestSync test = new TestSync(); Thread t1 = new Thread(test); Thread t2 = new Thread(test); t1.setName("t1"); t2.setName("t2"); t1.start(); t2.start(); } public void run(){ syncronized(this) { //没有这里也不可以 timer.add(Thread.currentThread().getName()); } }}
------解决方案--------------------------------------------------------
锁的是本身的对象,程序是用两个对象在调
------解决方案--------------------------------------------------------
两个房间两把钥匙(this)当然两个房间都能打开咯,也就没有锁住,如果你两个房间只有一把钥匙(静态变量)就能锁住了另一个房间