十一期间看了一点java多线程,现在又回顾了一下。看书-->论坛-->看书 算是一个很好的学习步骤。把理解的DD写下来就理解的更实在了。
public class TestThread implements Runnable{
private String info;
public TestThread(){}
public TestThread(String s){
this.info=s;
}
public synchronized void setInfo(String s){
this.info=s;
}
public synchronized void printInfo(){
while (true) {
System.out.println("print info..." + info);
}
}
public void run(){
printInfo();
}
public static void main(String[] args) {
TestThread t=new TestThread("001");
Thread t1=new Thread(t); //thread one
TestThread tt=new TestThread("002");
Thread t2=new Thread(tt); //thread two
Thread t3=new Thread(new TestClass(t));//thread three
t1.start();
t2.start();
t3.start(); //never execute, cause the object of t is locked in thread t1
}
}
class TestClass implements Runnable{
private TestThread tt;
public TestClass(TestThread tt){
this.tt=tt;
System.out.println("get iiiiiiiiiiiiit...");//can execute
}
public void run(){
tt.setInfo("0000000007");//blocked
tt.printInfo();
}
}
代码运行后,根本看不到0000000007输出在控制值或命令行;而是001与002交替输出:synchronized 并不是锁住代码块or方法,否则只有一个一直输出。
t与tt是不同的对象,他们之间没有什么线程安全问题。
t1.start(); 由于调用了printInfo()同步方法,t对象关联的锁被线程一所得,无限循环的输出(运行)导致的结果是,线程一在程序运行期间不会释放t对象的锁;所以27行启动线程三后会一直阻塞于39行,因为线程一、三访问的是同一对象,线程一不释放锁,39行中线程三觊觎这把锁,只能阻塞了。
有人会问35行怎么能执行?这里只是把对象引用指向堆中对象,并没有访问对象(给对象传消息),所以35行能执行。(传递的是对象引用的拷贝)
倘若把第7行的synchronized去掉,那么就能看到0000000007输出在控制值或命令行;此时线程三并未顺利执行,线程三只是执行了39行,阻塞于40行;因为setInfo不是同步方法了,调用此方法时,线程不需要得到对象的关联锁;而40行调用printInfo()同步方法时,只能阻塞了:线程一还没有释放此对象的锁...
第7、10行的两个同步方法可写成下面的形式:
public void setInfo(String s){
synchronized(this){
this.info=s;
}
}
public void printInfo(){
synchronized(this){
while(true){
System.out.println("print info..."+info);
}
}
}
synchronized(this)是不是很形象了:对象要调用本方法,就锁住此对象。
分享到:
相关推荐
Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...
Java多线程读大文件 java多线程写文件:多线程往队列中写入数据
java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题
一个java 多线程操作数据库应用程序!!!
详细的讲解了java多线程的原理,并配有代码进行实战,适合java初学者和想对多线程有进一步了解的人。
java多线程并发查询数据库,使用线程池控制分页,并发查询。
java多线程经典案例,线程同步、线程通信、线程阻塞等经典案例
多线程启动.java多线程启动.java多线程启动.java多线程启动.java
该文档总结了Java多线程相关的知识点,分享给大家,简单易懂!
基于java多线程的一款小游戏基于java多线程的一款小游戏基于java多线程的一款小游戏 基于java多线程的一款小游戏基于java多线程的一款小游戏基于java多线程的一款小游戏 基于java多线程的一款小游戏基于java多线程的...
java多线程处理数据库数据,使用并发包,无框架,可批量处数据库数据,进行增删改。。等等操作。
资深Java专家10年经验总结,全程案例式讲解,首本全面介绍Java多线程编程技术的专著 结合大量实例,全面讲解Java多线程编程中的并发访问、线程间通信、锁等最难突破的核心技术与应用实践 Java多线程无处不在,如...
现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。 线程是指进程中的一个执行流程,一个进程中可以运行多个线程。...本文档提供Java多线程编程经验,方便广大Java爱好者研究学习Java多线程
java多线程实现大批量数据切分成指定份数的数据,然后多线程处理入库或者导出,线程的个数和每份数据的数量都可以控制
java多线程处理大数据,可根据配置的线程数,任务去调度处理
java多线程进度条
java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...
Java多线程编程实战指南(核心篇) 高清pdf带目录 随着现代处理器的生产工艺从提升处理器主频频率转向多核化,即在一块芯片上集成多个处理器内核(Core),多核处理器(Multicore Processor)离我们越来越近了――如今...
java多线程,对多线程,线程池进行封装,方便使用
Java多线程实现异步调用实例。运行Main可以看到结果。main是主线程,另有A,B,C三个线程用不同的时间跑完。