黑马程序员技术交流社区
标题:
多线程中同步代码块问题
[打印本页]
作者:
闫月乐
时间:
2013-6-6 10:42
标题:
多线程中同步代码块问题
本帖最后由 闫月乐 于 2013-6-6 21:14 编辑
多线程的问题:
就那毕老师视频中讲的那个售票程序来说吧
1,为啥里面要用死循环啊?while(true)
2,多线程里面加上了同步代码块,牺牲了程序的性能提高了安全性,那这里岂不是和单线程一样?
还是说:同步代码块只是程序的一小部分,只有在运行到这里时才会单线程运行,代码块外还是提高了效率?有点晕晕呼呼的,麻烦大家结合好懂的例子
说一下多线程加上同步代码块,是不是和直接单线程一样了??
/*
* 4个窗口同时售票,总票数为100张,多线程思想
*/
//定义一个类去实现Runnable接口,这种方法避免了单继承的局限性,
class Ticket implements Runnable{
private int ticket=100;
//Runnable中只有一个run方法,用于存储线程汇总运行的代码,被实现需要覆盖该方法,
public void run(){
//1,为什么要定义成死循环??又或者说是不是在知道循环次数是时就可以不定义成死循环了?
while(true){
//同步代码块
synchronized(this){
//用于检测程序的安全性,而sleep()方法中有可能引发一场,所以要用try..catch,否则编译出错.
//Thread.sleep()让线程进入睡眠,模拟现实中临时故障的发生
try{
Thread.sleep(10);
}
catch(Exception e){
System.out.println(e.getMessage());
}
if(ticket>0){
System.out.println(Thread.currentThread().getName()+"刚刚售卖完第"+ticket--+"张票");
}
}
}
}
}
public class TicketTest {
public static void main(String[] args){
Ticket tk=new Ticket();
/*创建四个线程,开了四个窗口,Thread类中有Thread(Runnable target)构造方法,当向该方法传递
Runnable接口的类对象时,创建的线程会直接调用类对象中的run()方法作为它的运行代码.*/
Thread t1=new Thread(tk);
Thread t2=new Thread(tk);
Thread t3=new Thread(tk);
Thread t4=new Thread(tk);
//给线程取名字,纯属好看
t1.setName("1号窗口");
t2.setName("2号窗口");
t3.setName("3号窗口");
t4.setName("4号窗口");
//使线程开始执行
t1.start();
t2.start();
t3.start();
t4.start();
}
复制代码
作者:
刘凯
时间:
2013-6-6 10:57
1.wihle(ture)循环是保证这个程序循环执行,买票不会只卖出一张就结束吧。。 可能你还没有看到后边,后边会讲到停止线程,就是把while(flag)通过改变flsg的值来停止线程
2.同步代码块 上边必须有锁,以后同一个锁的同步代码块 或者是同步函数 才会判断是否持有锁 并依此执行 ,不是同一个所得同步代码块或者是同步函数 一样可以并发执行 这样必然会提高程序的运行效率
因此 多线程加上同步代码块 不一定就和单线程一样了
作者:
王鑫
时间:
2013-6-6 11:26
问题1.这个程序的目的就是为了看到多线程出现安全性问题的现象,循环100次未必就能使现象出现,
所以用wihle(true)循环是为了保证程序持续执行以使现象发生。
问题2.首先,同步代码块的前提之一就是必须要有两个或以上的多线程,所以有同步必然是多线程,不可能是单线程。
另外,这里说的降低效率是因为加入同步代码块后,每个线程需要对代码块上的锁进行判断,多了一次判断操作所以降低了程序的效率。
并不是说代码块内降低了效率,代码块外提高了效率。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2