java中关于线程同步,synchronized的问题
publicclassTestThreadimplementsRunnable{intb=0;publicstaticvoidmain(String[]args){Tes...
public class TestThread implements Runnable{
int b = 0;
public static void main(String[] args) {
TestThread tt = new TestThread();
Thread t = new Thread(tt);
t.start();//执行到这里的时候,另外一个线程开始执行,这个线程上执行的是run()方法
tt.m2();//当m2被执行的时候,就锁定了当前对象,只有m2执行完了m1才能执行
System.out.println(tt.b);
}
@Override
public void run() {
m1();
}
public synchronized void m1(){
b = 1000;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("b="+b);
}
public synchronized void m2(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
b = 2000;
}
}
程序的结果是
1000
b=1000
我想请问当执行到t.start()的时候调用了run()方法是不是就停住了?并没有继续执行run()中的m1().
混乱点在于,我一直以为是执行run()后会继续执行m1(),所以应该是m1先拿到synchronized,事实上是主函数只执行到t.start()调用run()后就暂停了,没有继续往下执行.
这时候主函数继续执行tt.m2()方法,所以这时候synchronized就被m2先拿走了,所以要等m2执行完m1才能够被执行? 展开
int b = 0;
public static void main(String[] args) {
TestThread tt = new TestThread();
Thread t = new Thread(tt);
t.start();//执行到这里的时候,另外一个线程开始执行,这个线程上执行的是run()方法
tt.m2();//当m2被执行的时候,就锁定了当前对象,只有m2执行完了m1才能执行
System.out.println(tt.b);
}
@Override
public void run() {
m1();
}
public synchronized void m1(){
b = 1000;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("b="+b);
}
public synchronized void m2(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
b = 2000;
}
}
程序的结果是
1000
b=1000
我想请问当执行到t.start()的时候调用了run()方法是不是就停住了?并没有继续执行run()中的m1().
混乱点在于,我一直以为是执行run()后会继续执行m1(),所以应该是m1先拿到synchronized,事实上是主函数只执行到t.start()调用run()后就暂停了,没有继续往下执行.
这时候主函数继续执行tt.m2()方法,所以这时候synchronized就被m2先拿走了,所以要等m2执行完m1才能够被执行? 展开
展开全部
当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
恭喜你猜对了,就是这么回事。
恭喜你猜对了,就是这么回事。
追问
tt.m2();这里是主线程上直接调用m2(),所以比t.start()调用run()方法,run()再调用m1()来的快??
所以synchronized先被m2拿走??
追答
是的,创建线程毕竟还是要一点时间的,虽然比创建进程快多了。当然代码块内部连续执行肯定是最快的。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2018-07-05 · 知道合伙人软件行家
关注
展开全部
synchronized用法不是这样的, 你这样写, 并没有异步读取数据, 每个线程都在持有自己的线程锁,你应该把这个synchronized放到外面去, 只能new一个出来让多线程去调用就有效果了.
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
new Thread(){}.start();这表示调用Thread子类对象的run方法,new Thread(){}表示一个Thread的匿名子类的实例对象,子类加上run方法后的代码如下:
new Thread(){
public void run(){
}
}.start();
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。m1的线程睡眠比m2睡眠时间长
new Thread(){
public void run(){
}
}.start();
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。m1的线程睡眠比m2睡眠时间长
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你确定执行后的结果就是你说的这个? 你多运行几次看看。你这个锁貌似加不加是没多大用的
追问
这个本身也就是个教学例子 程序本身并没多大意义~
运行结果确实是这样的..是先执行了m2 然后再执行m1 所以最后的值是1000
我的疑问也就在于t.start()应该是先调用了run(),run()调用了m1(),synchronized应该是先被m1拿到才对,但是事实上synchronized是先被m2拿到了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询