Java多线程编程基础之非线程的方法

[wait(),notify()/notityAll()方法]

关于这两个方法,有很多的内容需要说明.在下面的说明中可能会有很多地方 不能一下子明白,但在看完本节后,即使不能完全明白,你也一定要回过头来记住 下面的两句话:

[wait(),notify()/notityAll()方法是普通对象的方法(Object超类中实现), 而不是线程对象的方法]

[wait(),notify()/notityAll()方法只能在同步方法中调用]

[线程的互斥控制]

多个线程同时操作某一对象时,一个线程对该对象的操作可能会改变其状态, 而该状态会影响另一线程对该对象的真正结果.

这个例子我们在太多的文档中可以看到,就象两个操售票员同时售出同一张票 一样.

1.线程A在数据库中查询存票,发现票C可以卖出  
class="left"2.线程A接受用户订票请求,准备出票 .  
  3.这时切换到了线程B执行
  4.线程B在数据库中查询存票,发现票C可以卖出
  5.线程B将票卖了出去
6.切换到线程A执行,线程A卖了一张已经卖出的票  

所以需要一种机制来管理这类问题的发生,当某个线程正在执行一个不可分割 的部分时,其它线程不能不能同时执行这一部分.

象这种控制某一时刻只能有一个线程执行某个执行单元的机制就叫互斥控制 或共享互斥(mutual exclusion)

在JAVA中,用synchornized关键字来实现互斥控制(暂时这样认为,JDK1.5已经 发展了新的机制)

[synchornized关键字]

把一个单元声明为synchornized,就可以让在同一时间只有一个线程操作该方 法.

有人说synchornized就是一把锁,事实上它确实存在锁,但是是谁的锁,锁谁, 这是一个非常复杂的问题.

每个对象只有一把监视锁(monitor lock),一次只能被一个线程获取.当一个 线程获取了这一个锁后,其它线程就只能等待这个线程释放锁才能再获取.

那么synchornized关键字到底锁什么?得到了谁的锁?

对于同步块,synchornized获取的是参数中的对象锁:

synchornized(obj){
 //...............
 }

线程执行到这里时,首先要获取obj这个实例的锁,如果没有获取到线程只能等 待.如果多个线程执行到这里,只能有一个线程获取obj的锁,然后执行{}中的语句 ,所以,obj对象的作用范围不同,控制程序不同.

假如:

public void test(){
 Object o = new Object();
 synchornized(obj){
 //...............
 }
 }

时间: 2024-08-05 09:59:01

Java多线程编程基础之非线程的方法的相关文章

详解Java多线程编程中CountDownLatch阻塞线程的方法_java

直译过来就是倒计数(CountDown)门闩(Latch).倒计数不用说,门闩的意思顾名思义就是阻止前进.在这里就是指 CountDownLatch.await() 方法在倒计数为0之前会阻塞当前线程. CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. CountDownLatch 的作用和 Thread.join() 方法类似,可用于一组线程和另外一组线程的协作.例如,主线程在做一项工作之前需要一系列的准备工作,只有这些准备工

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

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

Java多线程编程基础之线程和多线程

[写在前面] 随着计算机技术的发展,编程模型也越来越复杂多样化.但多线程编程模型 是目前计算机系统架构的最终模型.随着CPU主频的不断攀升,X86架构的硬件已 经成为瓶,在这种架构的CPU主频最高为4G.事实上目前3.6G主频的CPU已经接近了顶峰. 如果不能从根本上更新当前CPU的架构(在很长一段时间内还不太可能),那么 继续提高CPU性能的方法就是超线程CPU模式.那么,作业系统.应用程序要发挥 CPU的最大性能,就是要改变到以多线程编程模型为主的并行处理系统和并发式 应用程序. 所以,掌握

Java多线程编程基础之线程对象

在进入java平台的线程对象之前,基于基础篇(一)的一些问题,我先插入两个基本概念. [线程的并发与并行] 在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent).而在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel). 在上面包括以后的所有论述中,请各位朋友谅解,我无法用最准确的词语来定义储

Java多线程编程实战之实现线程

Java编程语言使多线程如此简单有效,以致于某些程序员说它实际上是自然的.尽管在 Java 中使用线程比在其他语言中要容易得多,仍然有一些概念需要掌握.要记住的一件重要的事情是 main() 函数也是一个线程,并可用来做有用的工作.程序员只有在需要多个线程时才需要创建新的线程. Thread 类 Thread 类是一个具体的类,即不是抽象类,该类封装了线程的行为.要创建一个线程,程序员必须创建一个从 Thread 类导出的新类.程序员必须覆盖 Thread 的 run() 函数来完成有用的工作.

java多线程编程之捕获子线程异常示例_java

通过try catch是无法捕获子线程异常的,Thread对象提供了setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)方法用来获取线程中产生的异常. 复制代码 代码如下: package threads; import java.lang.Thread.UncaughtExceptionHandler; public class TextException{  public static void main(String

Java网络编程基础(三) Datagram类使用方法

Datagram(数据包)是一种尽力而为的传送数据的方式,它只是把数据的目的地记录在数据包中,然后就直接放在网络上,系统不保证数据是否能安全送到,或者什么时候可以送到,也就是说它并不保证传送质量. 1 UDP套接字 数据报(Datagram)是网络层数据单元在介质上传输信息的一种逻辑分组格式,它是一种在网络中传播的.独立的.自身包含地址信息的消息,它能否到达目的地.到达的时间.到达时内容是否会变化不能准确地知道.它的通信双方是不需要建立连接的,对于一些不需要很高质量的应用程序来说,数据报通信是一

Java多线程编程中synchronized线程同步的教程_java

0.关于线程同步 (1)为什么需要同步多线程?线程的同步是指让多个运行的线程在一起良好地协作,达到让多线程按要求合理地占用释放资源.我们采用Java中的同步代码块和同步方法达到这样的目的.比如这样的解决多线程无固定序执行的问题: public class TwoThreadTest { public static void main(String[] args) { Thread th1= new MyThread1(); Thread th2= new MyThread2(); th1.sta

详解Java多线程编程中的线程同步方法_java

1.多线程的同步: 1.1.同步机制:在多线程中,可能有多个线程试图访问一个有限的资源,必须预防这种情况的发生.所以引入了同步机制:在线程使用一个资源时为其加锁,这样其他的线程便不能访问那个资源了,直到解锁后才可以访问. 1.2.共享成员变量的例子:成员变量与局部变量: 成员变量: 如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作,这多个线程是共享一个成员变量的. 局部变量: 如果一个变量是局部变量,那么多个线程对同一个对象进行操作,每个线程都会有一个该局部变量的拷贝.他们之间