package thread.ticket;
class Ticket implements Runnable/*extends Thread*/{
private int tick = 100;
Object obj = new Object();①
public void run() {
while(true) {
synchronized(obj) {②
if (tick > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " sale : " + tick--);
}
}
}
}
}
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();
}
}
如上代码块,如果将①注销,然后将②处的obj替代为new Object()为什么不行呢??
谢谢
------解决思路----------------------
(1)①是在外部创建一个对象作为一个锁,线程公用。
(2)②根据循环,每次创建一个锁,这样,每个线程都有一个自己的锁,没有锁的概念了。
如果每个人都以一把钥匙,门每个人都能开,只有大家共有一把锁,才会有锁的竞争和等待释放。
------解决思路----------------------
你换成new Object()的话,每个线程到哪都创建一个,得到不是同一个锁,当然没用了!
------解决思路----------------------
new Object()等于每次都产生新的对象,每次锁的都是不同的对象,那么就不会产生互斥.
------解决思路----------------------
你如果在synchronized关键字后面新建对象,那同步还有什么意义??
同步原本的目的就是为了多个线程访问公用资源的时候,不会对公用资源产生串扰。如果资源是每个线程独有的,那就没有必要同步了,当成单线程来写就行了