synchronized同步问题

黑土墨 2012-08-04 10:52:44

public class BB extends Thread {
int time;
public BB (int t) {
this.time = t;
}

public synchronized void run() {
for(int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + " " + i + "次");
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(i ==5) {
System.out.println(Thread.currentThread().getName() + "退出了");
}
}
}

public static void main(String[] args) {
BB b1 = new BB(500);
b1.setName("线程1");
b1.start();

BB b2 = new BB(200);
b2.setName("线程2");
b2.start();

BB b3 = new BB(300);
b3.setName("线程3");
b3.start();
}
}

run()方法中有synchronized修饰符,为什么还是不能实现同步,输出结果仍然是无序的啊???
...全文
258 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
willleung_0 2012-08-06
  • 打赏
  • 举报
回复
非要设置sleep时间话要做到run()下面的循环里哦:


@Override
public synchronized void run() {
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + " " + i + "次");
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (i == 5) {
System.out.println(Thread.currentThread().getName() + "退出了");
time -= 200;
}
}
}
willleung_0 2012-08-06
  • 打赏
  • 举报
回复

package bb;

public class BB implements Runnable {

int time;

public BB(int t) {
time = t;
}

@Override
public synchronized void run() {
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + " " + i + "次");
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (i == 5) {
System.out.println(Thread.currentThread().getName() + "退出了");
}
}
}

public static void main(String[] args) {
BB b = new BB(500);
new Thread(b).start();
new Thread(b).start();
new Thread(b).start();
}
}

多线程共享需要使用Runnable哦~不过这样就不能分别设置sleep时间了.
sffx123 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:

synchronized 修饰的方法或对象 。 必须是得所有线程都能访问到的公有方法或对象。

这个不就是修饰的公有方法吗。
[/Quote]synchronized可以修饰共有方法,但是如果你放到非静态方法定义里面,表示使用当前对象作为锁,你程序每次都创建新的对象,锁的意义就没有了,用一个静态变量或者唯一的一个对象来作为锁即可synchronized (正在的全局唯一对象){
cao_zp 2012-08-06
  • 打赏
  • 举报
回复
public class BB extends Thread {
int time;
public BB (int t) {
this.time = t;
}

public void run() {
synchronized (BB.class)
for(int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + " " + i + "次");
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(i ==5) {
System.out.println(Thread.currentThread().getName() + "退出了");
}
}
}
}

public static void main(String[] args) {
BB b1 = new BB(500);
b1.setName("线程1");
b1.start();

BB b2 = new BB(200);
b2.setName("线程2");
b2.start();

BB b3 = new BB(300);
b3.setName("线程3");
b3.start();
}
}


关键是锁用的不对,改为如上的用法就可以了。
有什么问题可以再问我
飞翔的猪头三 2012-08-05
  • 打赏
  • 举报
回复
不用extends Thread,实现多线程要用Runnable接口,一个Runnabale对象可以创建多个线程,所创建的线程共享这个Runnable对象,这样就可以实现同步的效果了。
逅倁後覺 2012-08-04
  • 打赏
  • 举报
回复
synchronized 修饰的方法或对象 。 必须是得所有线程都能访问到的公有方法或对象。
licip 2012-08-04
  • 打赏
  • 举报
回复
你要同步对象吧。而且,你都是单独开的线程,这些线程之间没有共享资源的竞用情况呀。
nj_dobetter 2012-08-04
  • 打赏
  • 举报
回复
public class BB extends Thread {
static Object obj = new Object();
int time;
....
public void run() {
synchronized(obj){
//... 你的代码
}
}

}

你这样试试


nmyangym 2012-08-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 5 楼 的回复:

new 了三个线程,但用的不是同一个run方法,所以不可能达到楼主想到效果。
lz不妨试试让BB实现Runnable接口

main方法中
BB bb = new BB();
Thread b1 = new Thread(BB);
b1.setName(...);
start();
Thread b2 = new Thread(BB);
b2.set……
[/Quote]
这个办法好,自己盯住synchronized 的对象。在楼主的程序中,默认的是this.楼主在run()方法里加一句:

System.out.println("This object is "+this);

用你自己的程序和5楼的程序运行下,看看输出。
深蓝mg 2012-08-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:

new 了三个线程,但用的不是同一个run方法,所以不可能达到楼主想到效果。
lz不妨试试让BB实现Runnable接口

main方法中
BB bb = new BB();
Thread b1 = new Thread(BB);
b1.setName(...);
start();
Thread b2 = new Thread(BB);
b2.s……
[/Quote]
看7楼
wwwcomcn123 2012-08-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:

synchronized 修饰的方法或对象 。 必须是得所有线程都能访问到的公有方法或对象。

这个不就是修饰的公有方法吗。
[/Quote]

run方法能叫共有的方法吗
每个线程开启都会有自己的run方法
开启一个线程就会有自己的一个run();
楼主相当于有四条线程 一个主线程
三个分支线程 而这三个线程都有自己的run()方法 分开进行 互不影响!!!
| | | |
| | | |
| | | |
主 线1(run) 线2(run)线3(run)
Xero 2012-08-04
  • 打赏
  • 举报
回复
public synchronized void run();
这个方法,其实是针对当前对象加锁,所以,你new三个对象的话,有三个不同的锁,他们互不相干,当然就不能实现同步了。
这种写法,想表达的意思是,对于单一的一个BB对象,如果有多个线程调用其run方法,可以达到同步效果。
黑土墨 2012-08-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

new 了三个线程,但用的不是同一个run方法,所以不可能达到楼主想到效果。
lz不妨试试让BB实现Runnable接口

main方法中
BB bb = new BB();
Thread b1 = new Thread(BB);
b1.setName(...);
start();
Thread b2 = new Thread(BB);
b2.setName(...);
b2……
[/Quote]
这个为什么就可以了?
深蓝mg 2012-08-04
  • 打赏
  • 举报
回复
new 了三个线程,但用的不是同一个run方法,所以不可能达到楼主想到效果。
lz不妨试试让BB实现Runnable接口

main方法中
BB bb = new BB();
Thread b1 = new Thread(BB);
b1.setName(...);
start();
Thread b2 = new Thread(BB);
b2.setName(...);
b2.start();
...
黑土墨 2012-08-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

synchronized 修饰的方法或对象 。 必须是得所有线程都能访问到的公有方法或对象。
[/Quote]
这个不就是修饰的公有方法吗。

62,614

社区成员

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

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