黑马程序员技术交流社区
标题:
关于多线程的锁的问题
[打印本页]
作者:
无气打火机
时间:
2013-6-22 21:31
标题:
关于多线程的锁的问题
本帖最后由 孙百鑫 于 2013-6-27 07:42 编辑
public class Test {
public static void main(String[] args) {
ThreadDemo tm = new ThreadDemo();
Thread td1 = new Thread(tm);
Thread td2 = new Thread(tm);
td1.start();
td2.start();
}
}
public class ThreadDemo implements Runnable {
public int ticket = 100;
Object obj = new Object();
public void run() {
synchronized (obj) {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (ticket > 0) {
System.out.println(Thread.currentThread().getName()
+ "+++++++" + ticket);
ticket--;
}
}
}
}
}
为什么我加了锁之后就一直是一个线程在运行,另一个线程不运行?哪里出错了?求帮忙
作者:
peerless2012
时间:
2013-6-22 22:07
你逻辑错了,应该循环放到外面。如果放到里面,一个线程进去,while总是真,直到把票全卖完,另一个线程当然没机会执行了。
public class Test1 {
public static void main(String[] args) {
ThreadDemo tm = new ThreadDemo();
Thread td1 = new Thread(tm);
Thread td2 = new Thread(tm);
td1.start();
td2.start();
}
}
class ThreadDemo implements Runnable {
public int ticket = 100;
Object obj = new Object();
public void run() {
while (true) {
synchronized (this) {
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (ticket > 0) {
System.out.println(Thread.currentThread().getName()
+ "+++++++" + ticket);
ticket--;
}
}
}
}
}
复制代码
作者:
王磊
时间:
2013-6-23 00:10
楼主用synchronized锁住的是while循环,这样就代表只有循环运行结束,当前线程才会放锁,否则另一个线程永远在锁的外面,也就是while循环的外面等待。当当前线程执行完循环语句,则代表循环已结束,并且放锁。两个线程会继续运行,但是循环内部的判断永远为false,就形成了多线程的死循环。程序无法结束。
改法基本同楼上的,不过补充下,为了代码优化,如果按照楼上朋友的改法,就没必要在定义Object obj = new Object();。因为是无用的资源。可直接用ThreadDemo的对象作为锁,也就是this。
作者:
袁梦希
时间:
2013-6-23 09:03
加油 新人
作者:
无气打火机
时间:
2013-6-23 09:15
袁梦希 发表于 2013-6-23 09:03
加油 新人
谢谢版主的鼓励!嘿嘿
作者:
无气打火机
时间:
2013-6-23 09:15
袁梦希 发表于 2013-6-23 09:03
加油 新人
谢谢版主的鼓励!嘿嘿
作者:
HM朱蛟
时间:
2013-6-26 04:43
你把整个循环都锁了 这和锁run方法是一样的啊。。。
作者:
孙百鑫
时间:
2013-6-27 07:42
楼主您好。我已将您的帖子改成已解决。如果帖子发布长时间没加分。及时联系我。以免漏分的情况发生{:soso_e100:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2