zhaozhenfei500 2012-06-04 11:27
浏览 176
已采纳

Java多线程问题?

[code="java"]
package com.zzf.thread;

public class Test_03 {
public static void main(String[] args) {
// TODO 自动生成方法存根
TxtThread tt = new TxtThread();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
}
}

class TxtThread implements Runnable {
int num = 20;
String str = new String();
public void run() {
while (true) {
synchronized (str) {//这里的锁?
if (num > 0) {
try {
Thread.sleep(10);
} catch (Exception e) {
e.getMessage();
}
System.out.println(Thread.currentThread().getName()
+ "this is " + num--);
}
}
}
}
}
[/code]
输出结果:
Thread-0this is 20
Thread-0this is 19
Thread-0this is 18
Thread-0this is 17
Thread-0this is 16
Thread-0this is 15
Thread-0this is 14
Thread-0this is 13
Thread-0this is 12
Thread-0this is 11
Thread-0this is 10
Thread-0this is 9
Thread-3this is 8
Thread-3this is 7
Thread-3this is 6
Thread-3this is 5
Thread-3this is 4
Thread-3this is 3
Thread-3this is 2
Thread-3this is 1
我不明白的是:TxtThread也是一个类,每创建一个它的对象就会拥有它的属性,因此num,str不是共享的,不存在访问冲突的情况
另外代码中synchronized (str) //这里获取的锁是哪一个对象的?我不是太懂synchronized的使用方法和原理

  • 写回答

5条回答 默认 最新

  • 晓星 2012-06-04 11:42
    关注
    [code="java"]
    

    TxtThread tt = new TxtThread();
    new Thread(tt).start();
    new Thread(tt).start();
    new Thread(tt).start();
    new Thread(tt).start();
    [/code]
    这段代码的意思是,新建一个线程对象TxtThread ,可以理解成一个普通的对象,只是拥有一个run的方法而已。
    而后面
    new Thread(tt).start();
    表示新建线程且执行tt对象的run代码块,
    所以你后面的每个线程都共享tt线程的变量,即tt对象的属性,是同步资源,那么访问他们,可能就会有同步问题

    而你在方法中 synchronized (str) {//这里的锁?

    是str对象锁,下一个线程B访问就不能再次获取str的锁,必须等待前一个A线程执行完毕或者释放str锁时,才能让后续线程获取锁,并执行!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办