A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 任睦强 高级黑马   /  2012-5-17 23:11  /  1238 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Producer implements Runnable {
static int b;
public void run() {
for(int i=0; i<20; i++) {
Object wt = new Object(i);
ss.push(wt);
System.out.println("生产了:" + wt);
try {
Thread.sleep((int)(Math.random() * 200));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public synchronized void m1(){}
}


Producer p = new Producer();
new Thread(p).start();
new Thread(p).start();
new Thread(p).start();



Producer p1 = new Producer();
Producer p2 = new Producer();
Producer p3 = new Producer();
new Thread(p1).start();
new Thread(p2).start();
new Thread(p3).start();

同样启动三个线程,有什么区别呢?
一个是同一个对象的多个线程。
一个是多个对象的多个线程。

对于里面的同步方法是怎么执行的呢?对于Producer中的静态变量b又是怎么样同步的呢?希望得到解答呀。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

1 个回复

倒序浏览
        线程的执行具有同步与并发性
        同一个对象的多个线程,可以很有效的实现线程的同步,对象先启动第一个线程,执行完有关代码后,再启动第二个线程,依次执行。
        而多个对象的多个线程,可以更好地实现线程的并发执行机制,但当涉及到共享资源的竞争时,一定要防止并发安全的问题
        对于一个对象的多个线程,先启动new Thread(p).start();第一个线程,执行完相关代码后,再启动new Thread(p).start();第二个,依次执行
对于多个对象的多个线程, new Thread(p1).start();new Thread(p2).start();new Thread(p3).start();这三个线程同时启动 ,并发执行,各自独立地执行相应的代码。
        对于静态变量b,  一个对象的多个线程时,可先后调用b,实现同步。多个对象的多个线程时,如果都要用到b,则可能发生线程堵塞,出现资源竞争,面临线程等待资源的情况。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马