黑马程序员技术交流社区
标题:
线程问题
[打印本页]
作者:
山水游客
时间:
2012-6-19 14:29
标题:
线程问题
本帖最后由 孙胜录 于 2012-6-19 15:54 编辑
首先看下代码
class Ticket implements Runnable
{
int tickets = 1000;
Object object = new Object();
public void run()
{
while (true)
{
synchronized (new Object())//不会同步
{
if (tickets > 0)
{
try
{
Thread.sleep(10);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "saling....." + tickets--);
}
}
}
}
}
public class TicketDemo
{
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);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
在同步代码块synchronized ()中放入对象object时可以同步,为什么放入new Object()匿名对象时不能起到同步的作用?
作者:
李海晓
时间:
2012-6-19 14:47
不同线程启动调用run函数时,执行synchronized (new Object())语句时,锁住的是各自new出来的Object对象。不是同一个对象,所以能起到同步的作。
而用object时
Ticket t = new Ticket(); 只实例化一个Ticket类。
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
synchronized (object)要锁的是同一个对象,所以起到同步的作用
作者:
耿鑫
时间:
2012-6-19 14:55
很简单 每次执行到synchronized(new Object())时,你都创建一个新的对象,每次都是对新的对象上锁,不会影响到其他线程,如果你要是想同步的话,你可以这样synchronized(this)表示对当前对象上锁,当然也可以这样synchronized(Ticket.class)表示对这个类上锁。总之 synchronized()括号里是你要锁住的对象。之所以出现线程安全问题就是因为多个线程共享一个数据,所以你要把这一个数据锁上,而不是每次锁的时候都去锁一个不相干的新的数据,这和没有synchronized一样,根本没气到作用
作者:
龙秋地
时间:
2012-6-19 14:56
java对于多线程的安全问题提供了专业的解决方式.
就是同步代码块.
synchronized(对象)
{
需要被同步的代码
}
对象如同锁,持有锁的线程可以在同步中执行.
没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁.
如果楼主将对象带入为object,那么代码的执行是同一个锁,所以可以同步.
但是如果是new object()就不是一个对象了.不是同一个锁,所以不可以同步.
作者:
李伟
时间:
2012-6-19 15:48
同步必须是多个线程使用同一个锁,new Object()使得多个线程使用了多个锁
作者:
胡卿
时间:
2012-6-19 15:55
synchronized(object),括号里面表示的是同步锁,必须锁是一样才可以进行多线程同步
例如:object就相当于锁的钥匙,必须是匹配这个锁的钥匙才能打开,也就是同步,而new Objiect()每次new都相当于去买了一把新锁,而对应的钥匙自然也就不一样
那么多线程自然也就是因为钥匙的不匹配而达不到同步的效果
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2