java 多线程多个消费者之间是否需要同步锁? 200

 我来答
育知同创教育
2017-08-19 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
展开全部
正因为你是分别实例化的所以才会列队混乱.锁只能是锁对象,如果两个对象.各锁各的.不互相交叉,但共用一个数据.两个对象当然可能同时修改数据.

让你的程序共用一个对象试试..锁代码段没试过.锁方法试试?

class ClassD {
int k;

public ClassD(int k) {
this.k = k;
}
}

class ClassA {
static int[] b = { 1, 2 };
ClassD i;

public ClassA(ClassD i) {
this.i = i;
}

public void print() {
synchronized (b) {
System.out.println(i.k--);
}
}
}

class ClassB extends Thread {
public ClassA a;

public ClassB(ClassA a) {
this.a = a;
}

@Override
public void run() {
// TODO Auto-generated method stub
while (a.i.k > 0) {
a.print();
}
}

}

public class ClassC {
public static void main(String[] args) {
ClassD d = new ClassD(100);
ClassA a = new ClassA(d);
ClassA a2 = new ClassA(d);
ClassB b = new ClassB(a);
ClassB c = new ClassB(a2);
b.start();
c.start();
}
}

把如上程序可以改成如下这样一样没有问题不会乱!
class ClassD {
int k;

public ClassD(int k) {
this.k = k;
}
}

class ClassA {
ClassD i;

public ClassA(ClassD i) {
this.i = i;
}

public synchronized void print() {

System.out.println(i.k--);

}
}

class ClassB extends Thread {
public ClassA a;

public ClassB(ClassA a) {
this.a = a;
}

@Override
public void run() {
// TODO Auto-generated method stub
while (a.i.k > 0) {
a.print();
}
}

}

public class ClassC {
public static void main(String[] args) {
ClassD d = new ClassD(100);
ClassA a = new ClassA(d);
ClassB b = new ClassB(a);
ClassB c = new ClassB(a);
b.start();
c.start();
}
}

如上上楼所说如果锁的是一个静态的,那么所有的对象共用一个,不管你生成多少个对象锁都是有效的.如果不是静态的那么只有在当前对象中有效出了对象就无效了!
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式