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();
}
}
如上上楼所说如果锁的是一个静态的,那么所有的对象共用一个,不管你生成多少个对象锁都是有效的.如果不是静态的那么只有在当前对象中有效出了对象就无效了!
让你的程序共用一个对象试试..锁代码段没试过.锁方法试试?
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();
}
}
如上上楼所说如果锁的是一个静态的,那么所有的对象共用一个,不管你生成多少个对象锁都是有效的.如果不是静态的那么只有在当前对象中有效出了对象就无效了!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询