public class TestSynchronized implements Runnable {
int a = 100; public synchronized void show1() {
a = 1000;
try{
Thread.sleep(5000);
}catch(InterruptedException e){}
System.out.println("a = "+a);
} public void show2(){
try {
Thread.sleep(2500);
a = 2000;
}catch(InterruptedException e){}
}
public void run() {
show1();
}
public static void main(String args[]) {
TestSynchronized ts = new TestSynchronized();
Thread tt = new Thread(ts);
tt.start();
ts.show2();
System.out.println(ts.a);
}
}
这是个简单的小例子,关键就去却与synchronized这个关键字上。我描述下问题。各位大大请看!
这个先是show1方法加了锁。用tt启动线程后,a被赋值成了1000后,show1进入睡眠状态 。主方法里又调用show2的方法。因为show2没有锁,所以a的值最后定位2000; 问题出在这里。
show2 加上了synchronized后。最后的结果都变成了1000.我想问的是~
是某两个方法加锁以后,必须执行完某一个方法,解锁后才能执行另一个有锁的方法吗?这个例题是有两个线程 一个是main的线程,一个是tt 线程。两个线程访问两个加锁的方法。只有一个方法执行完了才能执行另一个吗?
java里只有一个锁吗?
一直没有绕过这个弯,请熟悉的朋友来告诉下。谢谢
int a = 100; public synchronized void show1() {
a = 1000;
try{
Thread.sleep(5000);
}catch(InterruptedException e){}
System.out.println("a = "+a);
} public void show2(){
try {
Thread.sleep(2500);
a = 2000;
}catch(InterruptedException e){}
}
public void run() {
show1();
}
public static void main(String args[]) {
TestSynchronized ts = new TestSynchronized();
Thread tt = new Thread(ts);
tt.start();
ts.show2();
System.out.println(ts.a);
}
}
这是个简单的小例子,关键就去却与synchronized这个关键字上。我描述下问题。各位大大请看!
这个先是show1方法加了锁。用tt启动线程后,a被赋值成了1000后,show1进入睡眠状态 。主方法里又调用show2的方法。因为show2没有锁,所以a的值最后定位2000; 问题出在这里。
show2 加上了synchronized后。最后的结果都变成了1000.我想问的是~
是某两个方法加锁以后,必须执行完某一个方法,解锁后才能执行另一个有锁的方法吗?这个例题是有两个线程 一个是main的线程,一个是tt 线程。两个线程访问两个加锁的方法。只有一个方法执行完了才能执行另一个吗?
java里只有一个锁吗?
一直没有绕过这个弯,请熟悉的朋友来告诉下。谢谢
给某个方法加synchronized意味该方法在任意时刻只能被一个线程执行,其它需要执行该方法的线程需要等待锁。
至于你说的两个线程访问两个加锁的方法跟访问没加锁的方法没什么区别。
synchronized除了用在方法上外还能用在对象上,用法为synchronized (object) {}
2. tt线程启动;
3. 主线程执行show2()方法,睡眠2.5秒,未持有任何对象的锁;
4. tt线程拿到ts的锁,执行show1()方法,将a的值修改为1000,并睡眠;
5. 主线程结束睡眠,将a的值修改为2000,同时show2()方法结束,此时a的值是2000;
6. 主线程继续执行main()方法余下部分,打印a的值(此时是2000);
7. tt线程结束睡眠,打印a的值(此时是2000);
当show1()、show2()都是synchronized的时候,执行的顺序很可能是这样的:1. 主线程启动;
2. tt线程启动;
3. 主线程首先拿到ts的锁,执行show2()方法;
4. 主线程进入show2()方法,睡眠2.5秒,并同时持有ts的锁,此时tt线程由于拿不到ts的锁而被挂起。
5. 主线程结束睡眠,将a的值修改为2000,同时show2()方法结束,主线程释放ts的锁,此时a的值是2000。
6. tt线程被唤醒,拿到ts的锁,将a的值修改为1000,并睡眠。
7. 主线程无需得到ts的锁就继续执行非synchronized部分,打印a的值(此时是1000)。
8. tt线程结束睡眠,打印a的值(此时仍然是1000)。
请允许我这个新手在提问一下问题,
就是为什么两个线程都等TS的锁呢?为什么TS会有锁?
synchronzied 不是锁了两个方法吗?哪个进程进去就锁定此方法,别的线程无法访问吗?
谢谢