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 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序