public class ceshi {
public static void main(String[] args) {
//  while(MyRunnable.NUM >= 0) {
// System.out.println("正在出售第" + MyRunnable.NUM-- + "张票");
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
MyRunnable t1 = new MyRunnable("线程1");
MyRunnable t2 = new MyRunnable("线程2");
MyRunnable t3 = new MyRunnable("线程3");
t1.start();
t2.start();
t3.start();
}
}class MyRunnable implements Runnable {
public static int NUM = 100;
private Thread t;
private String name; public MyRunnable(String name) {
this.name = name;
} public MyRunnable() {
} @Override
public void run() { while (true) {
synchronized ("1") {
if(NUM < 1) {
break;
}
System.out.println(name + ":  正在出售第" + NUM-- + "张票");
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
} } public void start() {
if (t == null) {
t = new Thread(this, "name");
t.start();
}
}
}
本人java新手,最近在学习多线程的时候关于同步多线程和单线程之间的区别不是很理解。
使用了同步的多线程因为每个线程之间不能同时访问共享数据,所以我理解上就觉得多线程之间也是一个一个排着队来的,好像和单线程没什么区别,但是大致测试后发现上述代码下,多线程还是比单线程快了3倍左右。就不是很理解,还望大神们给个解个疑惑ps:电脑是4核的。

解决方案 »

  1.   

    多线程是只有在共享的资源的时候才会等待,其余的部分都是同时进行的,而单线程就是只有完成了一个处理才进行下一个处理。
    举个简单的例子,
    就像有10个物体要从A点运到B点,中间会通过一道只能通过一个人的门
    单线程是一个人运,从A-》门-》B,再回到A,重复这个过程。
    多线程,是10个人同时运。从A-》门-》B。只有在门那里等了另一个人穿过门的过程,这个过程肯定比跑一个来回要快吧
      

  2.   

    因为你的 sleep() 不在同步块中。你试着将其移到同步块里面就知道了。
      

  3.   

    假如单核的情况下,多线程也是有性能上的优势的,但要看具体场景
    比如你复制一个文件,耗时操作都在IO上,CPU其实很闲,为啥不能干点别的呢?
      

  4.   

    你把 Thread.sleep(100); 这行代码注释掉,看看多线程是不是还会快。
      

  5.   

    1.首先多线程并不是所有线程同步执行,单核处理器多线程本质上和单线程一样的一个一个执行。列如最影响性能的I/O,当某个线程I/O传输出现堵塞,单线程必须等待这个堵塞结束才能继续运行。多线程则会在某个线程堵塞的时候,处理器调度切换运行其他的线程。高效就在于节约了堵塞的时间。就像收银员只有一个,只是半天掏不出钱的靠边站,下一个顾客先来掏钱。
    2.同步的多线程和单线程性能差别得看具体的场景而定,当同步加锁部分只是很少一部分的话还是同步多线程效率高。否则,两者运行效率是差不多的。