黑马程序员技术交流社区
标题: 关于线程,一直有个问题 [打印本页]
作者: 刘乃宽 时间: 2013-9-6 21:56
标题: 关于线程,一直有个问题
本帖最后由 杨增坤 于 2013-9-9 20:04 编辑
就是线程中“同步”二字的意思,也许有人觉得这不算问题,但是我一直不理解,听到同步总感觉怪怪的,一点没有同步的感觉。
大家谁理解的好帮我说说呗 , 就用例题吧。- class Ticket implements Runnable
- {
- private int tick = 1000;
- Object obj = new Object();
- public void run()
- {
- while(true)
- {
- synchronized(obj)
- {
- if(tick>0)
- {
- //try{Thread.sleep(10);}catch(Exception e){}
- System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);
- }
- }
- }
- }
- }
- class TicketDemo2
- {
- 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();
- }
- }
复制代码
作者: 刘乃宽 时间: 2013-9-6 22:03
为什么要叫同步呢,同步体现在哪儿
作者: 常在河边走_ 时间: 2013-9-6 22:08
本帖最后由 常在河边走_ 于 2013-9-6 22:27 编辑
当一个数同时被多条线程操作的时候,就会出现线程安全问题,出现的原因就是因为线程访问的延迟,以及线程执行的随机性。
同步的具体体现就是把可能出问题的代码用一个东西包围起来,在某一个线程执行的时候,其他线程都不能访问。直到这个线程结束。
在使用多线程的过程中,判断代码是否需要同步的方法是:A:程序被多个线程访问
B:有共享数据
C:共享数据被多条语句操作
作者: 李锡碧 时间: 2013-9-6 22:24
t1------------------>
t2------------------->
t3------------------>
t4---------------->
而不是 t1--------------->t2---------------->t3--------------->t4-------------->
作者: 辛春鹏 时间: 2013-9-6 22:33
我也是觉得怪怪的 明明就是不让人家线程同时执行的代码 叫什么同步嘛
后来想想。同步代码是需要,要被许多线程执行的代码。哪一个线程都会执行的啊。而不想别的代码一样只有主线程一个线程去执行的。。。。。所以,人家确实是应该叫同步的。
作者: 刘乃宽 时间: 2013-9-6 22:41
这个叫做多线程吧
作者: 刘乃宽 时间: 2013-9-6 22:44
还是晕 , 我再看看视频去
作者: 薛鹏鹏 时间: 2013-9-6 22:53
同步就是一个线程需要执行多行代码,等它从头执行到结束,才允许其他的线程执行这些代码
作者: 陈国柱 时间: 2013-9-6 23:01
我认为不可以只看同步两个字的意思,而应该将synchronized看成是一个锁才准确,就好像lock(),和unlock()一样,代码块被同步后,可以认为是产生了一把唯一的锁,那个线程要运行同步的代码块则必须要先要拥有这把锁。
作者: 李锡碧 时间: 2013-9-6 23:14
呜呜呜,又看了下你的提问,我搞错了,不好意思啊。{:soso_e127:}
线程 一个独立运行的程序,线程和其他线程会共享一些资源,然而这就会引起一些问题,可能会因为抢夺资源而发生冲突。因此引出了同步机制。
即各位线程之间要有个先来后到的去利用资源。
1.线程同步就是线程排队。同步就是排队。线程同步的目的就是避免线程“同步”执行。
2.是“共享”这两个字。只有共享资源的读写访问才需要同步。如果不是共享资源,那么就根本没有同步的必要。
3.只有变量才需要同步访问。如果共享资源是固定不变的,相当于常量,线程读取常量也不需要同步。至少一个线程修改共享资源,这样的情况下,多线程才要同步。
4.多个线程访问共享资源的代码有可能是同一份代码,也有可能是不同的代码;无论是否执行同一份代码,只要这些线程的代码访问同一份可变的共享资源,这些线程之间就需要同步。
作者: 刘乃宽 时间: 2013-9-7 00:13
线程同步就是线程排队。同步就是排队。线程同步的目的就是避免线程“同步”执行
{:soso_e179:} 这么想不错
作者: 杨增坤 时间: 2013-9-7 08:54
就是同时启动了多个线程,多个线程共享资源,就是买票,就是多个窗口可以同时操作同一个资源,而不是自己操作自己的。public class MyThread implements Runnable {
private int titck=5;
public void run(){
for(int i=0;i<100;i++)
if(this.titck>0){
System.out.println("卖票了"+this.titck--);
}
}
}
public class text {
public static void main(String [] agrs){
MyThread t1=new MyThread();
new Thread(t1).run();
new Thread(t1).run();
new Thread(t1).run();
}
}结果:
卖票了5
卖票了4
卖票了3
卖票了2
卖票了1
总结:同样是启动了三个线程,这是才是想要的结果,达到了资源共享。他们不是并发的操作,要是并发的话把run()方法改为start()
作者: 杨增坤 时间: 2013-9-7 08:55
楼主,你好!
如果您的问题解决了,请把您问题的未解决更改为已解决!
谢谢合作!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |