黑马程序员技术交流社区
标题:
多线程,同步问题
[打印本页]
作者:
戴进飘
时间:
2012-10-30 18:10
标题:
多线程,同步问题
本帖最后由 戴进飘 于 2012-10-31 14:07 编辑
多线程,同步问题:
为什么老师写的又没有出现错误,我的就出现错误了。郁闷呀!
public class DuoXianCheng_TwelveDay {
public static void main(String[] args) {
Ticket t = new Ticket();
/* 创建多个线程 */
Thread t1 = new Thread(t); //创建一个线程
Thread t2 = new Thread(t); //创建一个线程
Thread t3 = new Thread(t); //创建一个线程
t1.start(); //起动t1线程
t2.start(); //起动t2线程
t3.start(); //起动t3线程
}
}
class Ticket implements Runnable {
private int tick = 100;
private boolean b = true;
public void run() {
while (b) {
synchronized (new Object()) {
if (tick > 0) {
//让线程休眠(暂停执行),10毫秒
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "......."
+ tick--);
} else {
b = false;
}
}
}
}
}
复制代码
作者:
马振兴
时间:
2012-10-30 18:32
复制了下代码。没发现什么错误
LZ你把错误也发上来看看
作者:
王永荣
时间:
2012-10-30 18:35
本帖最后由 王永荣 于 2012-10-30 19:25 编辑
你的错在于
synchronized (new Object())
这句。
synchronized()中的对象可以看成是锁。
线程想要得到执行,首先必须得到这个锁,并且获得CPU资源,然后才能执行,执行完毕释放锁,下一个持有锁的线程进入CPU执行。
可以想象,这把锁得是固定的吧?就是说,只能是一个固定的对象。
而你的
new Object()
匿名对象,则完全不是固定的一个实例对象。换言之,线程所获得的锁可能完全不一样。
故而依然会出现同步执行的问题。
这就是为什么毕老师的视频里定义一个obj对象为锁。
其实可以把这些都去掉换成简简单单一个this就解决了。synchronized(
this
){....}
作者:
樊鹏飞
时间:
2012-10-30 21:11
你的synchronized (new Object()) 中 不应该用new Object() 你这样做使得每个线程执行时都会new Object() 用的根本不是同一个对象 线程的安全问题没有解决 .
同步的前提:
A:必须是两个或者两个以上的线程才需要同步。
B:
必须要保证多个线程使用的是同一个锁,才可以实现多个线程被同步
。
线程安全问题的解决方案:
A:同步代码块
锁对象是任意对象。
B:同步方法
锁对象是this对象。
C:静态方法
锁对象是当前资源对象的字节码文件对象(类名.class)。
你的问题可以将new Object()用this或者Ticket .class代替
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2