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--);}}}}}输出结果:Thread-0this is 20Thread-0this is 19Thread-0this is 18Thread-0this is 17Thread-0this is 16Thread-0this is 15Thread-0this is 14Thread-0this is 13Thread-0this is 12Thread-0this is 11Thread-0this is 10Thread-0this is 9Thread-3this is 8Thread-3this is 7Thread-3this is 6Thread-3this is 5Thread-3this is 4Thread-3this is 3Thread-3this is 2Thread-3this is 1我不明白的是:TxtThread也是一个类,每创建一个它的对象就会拥有它的属性,因此num,str不是共享的,不存在访问冲突的情况 另外代码中synchronized (str) //这里获取的锁是哪一个对象的?我不是太懂synchronized的使用方法和原理

解决方案

TxtThread tt = new TxtThread();new Thread(tt).start();new Thread(tt).start();new Thread(tt).start();new Thread(tt).start();这段代码的意思是,新建一个线程对象TxtThread ,可以理解成一个普通的对象,只是拥有一个run的方法而已。而后面new Thread(tt).start();表示新建线程且执行tt对象的run代码块,所以你后面的每个线程都共享tt线程的变量,即tt对象的属性,是同步资源,那么访问他们,可能就会有同步问题而你在方法中 synchronized (str) {//这里的锁? 是str对象锁,下一个线程B访问就不能再次获取str的锁,必须等待前一个A线程执行完毕或者释放str锁时,才能让后续线程获取锁,并执行!
解决方案二:
int num = 20; String str = new String(); 是tt对象全局变量,是你所建线程共享的。 synchronized (str) {//这里的锁? 这个是str对象锁,因为str是共享的,所以是同一把锁。
解决方案三:
tt对象是共享的!
解决方案四:
同步锁锁定的是STR,不是NUM,NUM是临界资源……
解决方案五:
TxtThread tt = new TxtThread(); // 这里只创建一次啊 new Thread(tt).start(); new Thread(tt).start(); new Thread(tt).start(); new Thread(tt).start(); // synchronized 用法,网上一大堆。

时间: 2024-11-10 00:21:39

Java多线程问题?的相关文章

关于java多线程中的join方法

问题描述 关于java多线程中的join方法 1.主线程可能在子线程结束之前 结束吗?如果可能的话 举一个例子 2.如何理解join方法, 结合实际应用. 非常感谢非常感谢!!! 解决方案 关于join,参考:http://www.blogjava.net/jnbzwm/articles/330549.html 解决方案二: 主线程可能在子线程结束之前 结束吗 一般来说不可以,但是也不一定,如果子线程在执行finally中的代码,应该会等它执行完了才退出. 晕,join方法和什么"让主线程等子线

实战Java多线程编程之不提倡的方法

编程|多线程 不提倡使用的方法是为支持向后兼容性而保留的那些方法,它们在以后的版本中可能出现,也可能不出现.Java 多线程支持在版本 1.1 和版本 1.2 中做了重大修订,stop().suspend() 和 resume() 函数已不提倡使用.这些函数在 JVM 中可能引入微妙的错误.虽然函数名可能听起来很诱人,但请抵制诱惑不要使用它们. 调试线程化的程序 在线程化的程序中,可能发生的某些常见而讨厌的情况是死锁.活锁.内存损坏和资源耗尽. 死锁 死锁可能是多线程程序最常见的问题.当一个线程

Java多线程编程详解

编程|多线程|详解 一:理解多线程多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立. 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单.多个线程的执行是并发的,也就是在逻辑上"同时",而不管是否是物理上的"同时".如果系统只有一个CPU,那么真正的"同时"是不可

Java多线程程序设计

程序|多线程|设计 一:理解多线程 多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立. 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单. 多个线程的执行是并发的,也就是在逻辑上"同时",而不管是否是物理上的"同时".如果系统只有一个CPU,那么真正的"同时"是

Java多线程编程经验谈

编程|多线程 不管我是多么喜欢JAVA但是,从实际开发角度讲,Java的多线程确实没有C++好使. 表现在:1.Java没有全局变量:2.Java 的线程之间的通信比较差,C++提供了多种通信方式:3.Java的数据同步是通过synchronized来实现,但是基本上等于交给了虚拟机来完成,而C++有很多种:临界区.互斥体等.4. Java的多线程run方法没有返回值,因此如何能得到子线程的反馈信息,确实令人头疼.5.Java的多线程是协作式,这样等于操作系统放弃了对线程的控制: 这里谈谈我在j

深入浅出Java多线程程序设计

程序|多线程|设计 一:理解多线程 多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立. 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单. 多个线程的执行是并发的,也就是在逻辑上"同时",而不管是否是物理上的"同时".如果系统只有一个CPU,那么真正的"同时"是

Java多线程:“基础篇”05之线程等待与唤醒

wait(), notify(), notifyAll()等方法介绍 在Object.java中,定义了wait(), notify()和notifyAll()等接口.wait()的作用是让当前线程进入 等待状态,同时,wait()也会让当前线程释放它所持有的锁.而notify()和notifyAll()的作用,则是唤 醒当前对象上的等待线程:notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程. Object类中关于等待/唤醒的API详细信息如下: notify()    

Java多线程:“基础篇”01之基本概念

多线程是Java中不可避免的一个重要主体.从本章开始,我们将展开对多线程的学习.接下来的内容 ,是对"JDK中新增JUC包"之前的Java多线程内容的讲解,涉及到的内容包括,Object类中的 wait(), notify()等接口:Thread类中的接口:synchronized关键字. 注:JUC包是指,Java.util.concurrent包,它是由Java大师Doug Lea完成并在JDK1.5版本添加到 Java中的. 在进入后面章节的学习之前,先对了解一些多线程的相关概念

Java多线程:“JUC原子类”03之AtomicLongArray原子类

AtomicLongArray介绍和函数列表 在"Java多线程系列--"JUC原子类"02之 AtomicLong原子类"中介绍过, AtomicLong是作用是对长整形进行原子操作.而AtomicLongArray的作用则是对"长整形数组" 进行原子操作. AtomicLongArray函数列表 // 创建给定长度的新 AtomicLongArray. AtomicLongArray(int length) // 创建与给定数组具有相同长度的

Java多线程:“JUC锁”04之公平锁(二)

概要 前面一章,我们学习了"公平锁"获取锁的详细流程:这里,我们再来看看"公平锁 "释放锁的过程.内容包括: 参考代码 释放公平锁(基于JDK1.7.0_40) "公平锁"的获取过程请参考"Java多线程系列--"JUC锁"03之 公平锁 (一)",锁的使用示例请参考"Java多线程系列--"JUC锁"02之 互斥锁 ReentrantLock". 注意: (01)