`
kong_bai
  • 浏览: 138670 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java中的多线程编程

阅读更多
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
package ths;
public class Thread1 implements Runnable {
public void run() {
 synchronized(this) {
  for (int i = 0; i < 5; i++) {
   System.out.println(Thread.currentThread().getName() + " synchronized loop " + i); 
  }
 } 
} 
public static void main(String[] args) {
 Thread1 t1 = new Thread1();
 Thread ta = new Thread(t1, "A");
 Thread tb = new Thread(t1, "B");
 ta.start();
 tb.start(); 
} 
}

结果:
A synchronized loop 0
A synchronized loop 1
A synchronized loop 2
A synchronized loop 3
A synchronized loop 4
B synchronized loop 0
B synchronized loop 1
B synchronized loop 2
B synchronized loop 3
B synchronized loop 4
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
package ths;
public class Thread2 {
 public void m4t1() { 
  synchronized(this) {
   int i = 5;
   while( i-- > 0) {
    System.out.println(Thread.currentThread().getName() + " : " + i);
    try {
     Thread.sleep(500); } 
    catch (InterruptedException ie) {
    } 

   } 
  } 
 }
 public void m4t2() {
  int i = 5;
  while( i-- > 0) {
   System.out.println(Thread.currentThread().getName() + " : " + i); 
  try {
   Thread.sleep(500); }
   catch (InterruptedException ie) {
  }
 } 
}

 public static void main(String[] args) {
  final Thread2 myt2 = new Thread2();
  Thread t1 = new Thread(
  new Runnable() {
   public void run() {
    myt2.m4t1();
   } 
  }, "t1");
  Thread t2 = new Thread(
  new Runnable() {
   public void run() {
   myt2.m4t2();
   } 
  }, "t2"); 
  t1.start();
  t2.start(); 
 }
}
结果:
t1 : 4
t2 : 4
t1 : 3
t2 : 3
t1 : 2
t2 : 2
t1 : 1
t2 : 1
t1 : 0
t2 : 0
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
package ths;
public class Thread2 {
 public void m4t1() { 
  synchronized(this) {
   int i = 5;
   while( i-- > 0) {
    System.out.println(Thread.currentThread().getName() + " : " + i);
    try {
     Thread.sleep(500); } 
    catch (InterruptedException ie) {
    } 

   } 
  } 
 }
 public void m4t2() {
  int i = 5;
  synchronized(this) {
   while( i-- > 0) {
    System.out.println(Thread.currentThread().getName() + " : " + i); 
    try {
     Thread.sleep(500); }
     catch (InterruptedException ie) {
    }
   }
  }
 } 
}

 public static void main(String[] args) {
  final Thread2 myt2 = new Thread2();
  Thread t1 = new Thread(
  new Runnable() {
   public void run() {
    myt2.m4t1();
   } 
  }, "t1");
  Thread t2 = new Thread(
  new Runnable() {
   public void run() {
   myt2.m4t2();
   } 
  }, "t2"); 
  t1.start();
  t2.start(); 
 }
}
结果:
t1 : 4
t2 : 3
t1 : 2
t2 : 1
t1 : 0
t2 : 4
t1 : 3
t2 : 2
t1 : 1
t2 : 0
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
五、以上规则对其它对象锁同样适用:
package ths;

public class Thread3 {

class Inner {

private void m4t1() {

int i = 5;

while(i-- > 0) {

System.out.println(Thread.currentThread().getName() + " : Inner.m4t1()=" + i);

try {

Thread.sleep(500);

} catch(InterruptedException ie) {

}

} 

}

private void m4t2() {
int i = 5;
while(i-- > 0) {

System.out.println(Thread.currentThread().getName() + " : Inner.m4t2()=" + i);

try {

Thread.sleep(500);

} catch(InterruptedException ie) {

}
}

}

}

private void m4t1(Inner inner) {

synchronized(inner) { //使用对象锁

inner.m4t1(); 

}

}


private void m4t2(Inner inner) {
inner.m4t2();
}
public static void main(String[] args) {


 final Thread3 myt3 = new Thread3();
 final Inner inner = myt3.new Inner();
 Thread t1 = new Thread(
 new Runnable() {
   public void run() {
   myt3.m4t1(inner); 
   } 
  }, "t1");
 Thread t2 = new Thread(
  new Runnable() {
   public void run() {
   myt3.m4t2(inner);
   } 
  }, "t2");
 t1.start();
 t2.start();
 }
}
结果:
尽管线程t1获得了对Inner的对象锁,但由于线程t2访问的是同一个Inner中的非同步部分。所以两个线程互不干扰。
t1 : Inner.m4t1()=4
t2 : Inner.m4t2()=4
t1 : Inner.m4t1()=3
t2 : Inner.m4t2()=3
t1 : Inner.m4t1()=2
t2 : Inner.m4t2()=2
t1 : Inner.m4t1()=1
t2 : Inner.m4t2()=1
t1 : Inner.m4t1()=0
t2 : Inner.m4t2()=0
现在在Inner.m4t2()前面加上synchronized:
private synchronized void m4t2() {
 int i = 5;
 while(i-- > 0) {
  System.out.println(Thread.currentThread().getName() + " : Inner.m4t2()=" + i);
  try {
   Thread.sleep(500);
  } catch(InterruptedException ie) {
  }
 }
}
结果:
尽管线程t1与t2访问了同一个Inner对象中两个毫不相关的部分,但因为t1先获得了对Inner的对象锁,所以t2对Inner.m4t2()的访问也被阻塞,因为m4t2()是Inner中的一个同步方法。
t1 : Inner.m4t1()=4
t1 : Inner.m4t1()=3
t1 : Inner.m4t1()=2
t1 : Inner.m4t1()=1
t1 : Inner.m4t1()=0
t2 : Inner.m4t2()=4
t2 : Inner.m4t2()=3
t2 : Inner.m4t2()=2
t2 : Inner.m4t2()=1
t2 : Inner.m4t2()=0

分享到:
评论

相关推荐

    汪文君JAVA多线程编程实战(完整不加密)

    《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...

    JAVA多线程编程技术PDF

    这份“JAVA多线程编程技术PDF”是学习和掌握这一领域的经典资料,涵盖了多线程的全部知识点。 首先,多线程的核心概念包括线程的创建与启动。在Java中,可以通过实现Runnable接口或继承Thread类来创建线程。创建后...

    Java多线程编程技术试议.pdf

    本文主要讨论Java多线程编程技术的实现,涵盖了多线程的概念、Java中多线程编程的技术层面问题、多线程的实现方法、多线程的优缺点等方面。 Java多线程编程的概念: 多线程是指在一个程序中同时存在多个执行体,每...

    Java多线程编程实战指南(核心篇)

    Java多线程编程实战指南(核心篇) 高清pdf带目录 随着现代处理器的生产工艺从提升处理器主频频率转向多核化,即在一块芯片上集成多个处理器内核(Core),多核处理器(Multicore Processor)离我们越来越近了――如今...

    Java多线程编程实战指南-核心篇

    《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

    Java多线程编程

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过`Thread`类和并发工具来实现,接下来我们将深入探讨这些关键知识点。 1. **...

    java多线程编程

    线程同步是多线程编程中防止数据竞争的关键。Java提供了多种同步机制: 1. synchronized关键字:可以修饰方法或代码块,确保同一时刻只有一个线程访问特定的代码。 2. volatile关键字:用于保证共享变量的可见性和...

    Java多线程编程指南

    Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。 ...

    java 多线程编程指南

    这份“Java多线程编程指南”深入探讨了这一主题,为中级到高级的Java开发者提供了宝贵的资源。 首先,多线程的基础概念是理解整个主题的关键。线程是程序执行的最小单元,每个线程都有自己的程序计数器、虚拟机栈、...

    Java多线程编程技术

    《Java多线程编程核心技术》建议猿友们读两遍,因为其写得没有那么抽象,第一遍有些概念不是很理解,可以先跳过并记录起来,第一遍阅读的目的主要是了解整个架构。第二遍再慢慢品味,并贯穿全部是指点来思考,并将...

    深入学习:Java多线程编程

    4. **并发工具类**:Java的并发包(java.util.concurrent)包含许多高效并发工具,如CountDownLatch、CyclicBarrier、Future和Callable,它们在多线程编程中扮演重要角色。 5. **并发集合**:线程安全的集合类,如...

    Java多线程编程实例

    本书“Java多线程编程实例”深入浅出地讲解了如何在Java环境中实现多线程操作,尽管出版时间较早,但其内容的经典性和实用性使其在现代开发中仍具有极高的参考价值。 首先,我们要理解Java中的线程是如何创建的。...

    Java_多线程与并发编程总结.doc

    Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...

    4JAVA编程高级-多线程编程

    死锁是多线程编程中常见的一个问题,它发生在两个或更多的线程永久阻塞,每个线程都在等待另一个线程释放资源的情况。解决死锁的方法包括但不限于: - 使用锁顺序:始终以相同的顺序获取锁。 - 使用超时:尝试获取锁...

    【JAVA多线程】多线程编程核心技术学习资料

    在Java多线程编程中,有以下几个核心概念和特性: 1. 同步机制:包括synchronized关键字,它可以修饰方法或代码块,确保同一时间只有一个线程能访问特定的代码段。此外,还有Lock接口和ReentrantLock等锁机制,提供...

    Java多线程编程,生命游戏,用线程池.zip

    Java多线程编程,生命游戏,用线程池.zipJava多线程编程,生命游戏,用线程池.zip Java多线程编程,生命游戏,用线程池.zipJava多线程编程,生命游戏,用线程池.zip Java多线程编程,生命游戏,用线程池.zipJava多...

Global site tag (gtag.js) - Google Analytics