关于synchronized实现进程同步的问题,新人求解!!!

花开花落半春秋 2016-05-09 10:47:53
package day12;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
* 创建10个任务,每个任务分
别输出10个数字,第一个任务输出
1-10,第二个任务输出11-20,一次类
推将所有任务交给线程池处理。
*/
public class Exercise3 {
public static void main(String[] args) {
ExecutorService exec = Executors.newFixedThreadPool(3);
for(int j = 0;j<10;j++)
exec.execute(new MyRunnable());

exec.shutdown();
}
}
class MyRunnable implements Runnable{
private static int threadnum = 1;
public void run(){
show();
}
public synchronized void show(){
System.out.println(Thread.currentThread()+","+threadnum++);
// 如何让其完整输出?
// threadnum++;
for(int i = 1;i<=10;i++)
System.out.print((threadnum-2)*10+i+" ");

System.out.println();
}
}
上述方法输出会出问题,一个线程不是同时输出10个数,但是当我将show方法放到一个类中时,可以正常输出,为何会这样
上面synchronized关键字为何不能保证一次只输出10个数?

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
* 创建10个任务,每个任务分
别输出10个数字,第一个任务输出
1-10,第二个任务输出11-20,一次类
推将所有任务交给线程池处理。
*/
public class Exercise3 {
public static void main(String[] args) {
ExecutorService exec = Executors.newFixedThreadPool(3);
for(int j = 0;j<10;j++)
exec.execute(new MyRunnable());

exec.shutdown();
}
}
class MyRunnable implements Runnable{
private static int threadnum = 1;
public void run(){
Test.show();
}
}
class Test{
private static int threadnum = 1;
public static synchronized void show(){
System.out.println(Thread.currentThread()+","+threadnum++);
// 如何让其完整输出?
// threadnum++;
for(int i = 1;i<=10;i++)
System.out.print((threadnum-2)*10+i+" ");

System.out.println();
}
}
...全文
428 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
X元素 2017-01-21
  • 打赏
  • 举报
回复
我简单的看了一下 楼主的代码,虽然一些方法声明了synchronized 但是没有相关的锁对象,建议楼主看一下 synchronized 锁class 锁对象,分别都是如何进行的。
X元素 2017-01-21
  • 打赏
  • 举报
回复
楼主 发帖如果涉及到代码,可以考虑 将代码设置成对应语言,方便大家帮你看问题。
  • 打赏
  • 举报
回复
没人回答,结贴算了
blablablafish 2017-01-21
  • 打赏
  • 举报
回复
我的理解是,如果你把show()放在MyRunnable类里面的,那生成了10个MyRunnable实例自然也就有10个独立的show()方法,即每个线程都有自己独立的show方法,这样达不到共享的目的,synchronized加上去也没用。但是你把show()放在了Test类里面,并且是static修饰,那就表明show方法是归类所有,内存里面只会存在一个show()方法,所以所有的线程会共享这个show()方法,就会得到你想要的结果。
李德胜1995 2017-01-21
  • 打赏
  • 举报
回复
synchronized(MyRunnable.class)用这个在show()里面锁住就可以了

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧