黑马程序员技术交流社区
标题:
请进来。。。。。
[打印本页]
作者:
班志国
时间:
2012-11-28 17:15
标题:
请进来。。。。。
class Ticket implements Runnable{
private static int tick = 100;
public void run{
while(tick>0){
if(tick>0){//这加上同步代码块 那不就是 线程一 运行完了 线程二才 能进来吗 那线程一 不是把所有的 票买完了吗 其他线程 还怎么买啊
System.out.println(currentThread().getName()+"sale : "+tick--);
}
}
}
}
复制代码
作者:
齐银春
时间:
2012-11-28 17:30
多线程是多个线程同步切换进行,买票时会切换着卖,就像火车售票窗口一样,如果正好临到一个窗口时票卖完了,那么也就结束了
作者:
黑马_郑亮新
时间:
2012-11-28 17:44
while(tick>0){
synchronized /*在 if 语句的外面加同步代码块,线程1运行完了,把锁打开。
当其他线程拿到cpu执行权时,进来先把锁关闭再执行里面的代码,以此类推。。。。,这是我个人的理解*/
{
if(tick>0)
{
System.out.println(currentThread().getName()+"sale : "+tick--);
}
}
}
作者:
黑马_郑亮新
时间:
2012-11-28 17:45
class Ticket implements Runnable{
private static int tick = 100;
Object ob=new Object();
public void run{
while(tick>0){
synchronized(ob) /*在 if 语句的外面加同步代码块,线程1运行完了,把锁打开。
当其他线程拿到cpu执行权时,进来先把锁关闭再执行里面的代码,以此类推。。。。,这是我个人的理解*/
{
if(tick>0)
{
System.out.println(currentThread().getName()+"sale : "+tick--);
}
}
}
}
}
作者:
梁胜海
时间:
2012-11-28 17:55
线程同步的意义是不让你卖票大于票数,不然扯淡了
作者:
彭璞
时间:
2012-11-28 18:20
线程同步你还没有理解
线程同步 同一时间只保证,一个线程访问方法或变量。
在Java语言中,通过被关键字synchronized修饰的方法或synchronized语句块实现对代码的同步包含在synchronized方法或语句块中的代码称为被同步的代码(Synchronized Code)当线程访问被同步的代码时,必须首先竞争代码所属的类的【对象上的锁】,否则线程将等待(阻塞),直到锁被释放.
上例中if语句加了synchronized只是锁了这一个代码块,当一个线程运行进入这个代码块的时候,这个代码块就被锁住了,不能让其他的线程访问了,其他的线程运行到这只有等这个线程运行完了,释放了这个锁,才能运行;在这个代码块中一个线程只会买一张票,买完了就退出释放锁,不是for循环,不会一直买的,其他线程进来也是买一张票,等某一个线程进来判断tick<0时候,表示没票了,就买不到了
作者:
班志国
时间:
2012-11-28 20:28
彭璞 发表于 2012-11-28 18:20
线程同步你还没有理解
线程同步 同一时间只保证,一个线程访问方法或变量。
在Java语言中,通过被关键字syn ...
同一时间只有一个线程访问方法或变量 是不是 这一个线程 会把 所有变量访问完呢 就如我的代码 ticket-- 一直买到 0 为止??
作者:
彭璞
时间:
2012-11-28 21:33
比方说,一个厕所,现在只能让100个人使用了,然后就关闭不让用了,当一个人进去了,这个厕所就被占用了,其他的人就只能等在外面,等这个人出来才能用,相当于这个厕所被这个人锁住,这个厕所就是你代码中syncronized锁定的代码块,等这个人出来了,这个人只使用了100次机会中的一次,还有99次机会供其他人用的,你的程序中一个线程进入代码块在出来也是一样,只买了一张票,还有99张其他人还能买,而不是这个线程进入代码块,一下子买了100张票,你在体会下
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2