"
package com.btmans.thread;
public class TestSync implements Runnable{ int b = 100; public synchronized void m1() throws Exception{ b = 1000; Thread.sleep(5000); System.out.println("b="+b);
}
public synchronized void m2() throws Exception{
Thread.sleep(3000);
b = 2000;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
m1();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
TestSync ts = new TestSync();
Thread t = new Thread(ts);
t.start();
ts.m2();
System.out.println("=="+ts.b);
}
}
输出结果是:
==1000
b=1000
第二种情况:加上下面红色代码部分
package com.btmans.thread;
public class TestSync implements Runnable{
int b = 100;
public synchronized void m1() throws Exception{
System.out.println("m1");"新增部分"
b = 1000;
Thread.sleep(5000);
System.out.println("b="+b);
}
public synchronized void m2() throws Exception{
System.out.println("m2");"新增部分"
Thread.sleep(3000);
b = 2000;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
m1();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
TestSync ts = new TestSync();
Thread t = new Thread(ts);
t.start();
ts.m2();
System.out.println("=="+ts.b);
}
}
然后结果有时候是
m2
m1
==1000
b=1000
有时候又是
m2
m1
==2000
b=1000
这我就头大了,就只加了一个输出语句而已,为什么加过还会变化呢?加了"synchronized"后,代码的执行顺序到底是怎么样的呢?搞不明白了。
" ![image.png](https://ucc.alicdn.com/pic/developer-ecology/e037f22ae4924b6290a71a3f914b4c7a.png)
m1
m2
方法都加了 synchronized
关键字,t.start() 和 ts.m2() 这里用的是同一个对象 ts
,这里两个线程,当一个线程获取锁执行的时候,另一个只能等待,而谁先获取锁,这是不确定的。
无非就是谁先抢到锁谁执行咯。。你第一种情况只有一种输出只是测试次数不够多罢了
######main方法里的打印语句可没有同步,所以只能保证它在m2之后执行,至于它和m1中的语句顺序是没有什么保证的。
![image.png](https://ucc.alicdn.com/pic/developer-ecology/e585ce1250c641fca02feafd082be8e1.png)版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。