黑马程序员技术交流社区
标题:
为什么每次只能执行一条线程呢?
[打印本页]
作者:
李能甫
时间:
2015-4-1 12:10
标题:
为什么每次只能执行一条线程呢?
public class Test2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//Tese1 tes=new Tese1();
//tes.start();
//tes.run();
Tese2 ts2=new Tese2();
Thread t=new Thread(ts2);
Thread t1=new Thread(ts2);
Thread t2=new Thread(ts2);
Thread t3=new Thread(ts2);
t.start();
t1.start();
t2.start();
t3.start();
}
}
class Tese2 implements Runnable{
private int num=100;
@Override
public synchronized void run() {
// TODO Auto-generated method stub
Object obj=new Object();
while (true) {
synchronized (obj) {
if (num>0) {
try {
Thread.sleep(10);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println(Thread.currentThread().getName()+"--"+num--);
}
}
}
}
}
就是不怎么明白,这段代码的执行原理,只是照着敲了一遍。
作者:
林吉前
时间:
2015-4-1 12:14
{:2_35:}Synchronized() 是一个锁,就像你家的门一样 就一把锁 在你手里 你就是那个拿着锁的线程 你拿着锁 开门进家了 外面的人没有锁怎么进去? 你进家里洗了澡出去了 把锁给别人 跟别人说 我洗好了 到你了 锁的钥匙给你 你进去 然后另一个人就进去了 门又关上了 或者你出来后还想再洗一次 那你就有进去把们关上了
作者:
王小乖
时间:
2015-4-1 12:15
因为存在synchronized,在synchronized代码块中的语句,只能进去一个线程执行,只要进去的线程执行不完,别的线程就不能进去执行
作者:
林吉前
时间:
2015-4-1 12:16
林吉前 发表于 2015-4-1 12:14
Synchronized() 是一个锁,就像你家的门一样 就一把锁 在你手里 你就是那个拿着锁的线程 你拿着锁 ...
{:2_35:}就是那么个意思了 锁跟钥匙有点分不清 理解成反锁门好了 那种进去就有个插销的洗手间? 去过吧 公共厕所 进去以后到里面把们反锁上 上好厕所 把插销一拔又出来了 然后别人才可以上 或者你自己还想再上一次 又进去把插销插上。。。别人又进不去了 只能在外面等着
作者:
tubao1991
时间:
2015-4-1 13:38
呵呵!楼上说的都对!Synchronized所定义的为同步代码块,理解“同步”就是一个一个来。
作者:
lrd7512369
时间:
2015-4-1 14:30
同步了啊,为了防止共享数据出错,实现同步的方法就是一条一条的执行线程,这也是它的局限性
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2