runo and start Methods Thread类和 Runnable接口的rumn0方法是 个回调 Callback)方法,当 Thread类实例表 示的线程被执行时,此方法将被JM调用 完成线程的功能 Thread类的sart0方法用于启动一个线程, 使线程进入就绪状态,等待线程调度器的执 Thread th=new MyThread o; th. start0;←启动线程
run() and start() Methods • Thread类和Runnable接口的run()方法是一 个回调(Callback)方法,当Thread类实例表 示的线程被执行时,此方法将被JVM调用, 完成线程的功能 • Thread类的start()方法用于启动一个线程, 使线程进入就绪状态,等待线程调度器的执 行Thread th=new MyThread(); th.start(); 启动线程
Corrupting Data Probler T1 T2 100 a=X: b=X 象染称 a=a+200; b=b-100 X=a 300 X=b 0
Corrupting Data Problem • 当多个线程交替访问并修改同一个数据对象 时,可能会破坏数据的一致性,或称为污染 (corrupt)数据 • 共多个线程同时访问并修改的数据对象也称 为临界区域(critical regions) T1 X T2 100 300 0 X=a; a=X; b=X; a=a+200; b=b-100; X=b;
获得X上的锁 100 a=X 等待X上的锁 a=a+200 X=a; 300 释放X上的锁 获得X上的锁 b=X b=x: 生 b=b-100; Xb 200 释放X上的锁
Synchronization • 通过同步(synchronizing)对临界区域的访问 可以解决数据污染问题 • 同步锁协议:线程在操作某个对象前,必须 获得该对象上的锁(lock),完成操作后释放 对象上的锁,没有得到锁的线程必须等待锁 的释放,如果线程在操作对象的过程中发生 了异常,则自动释放对象上的锁 T1 X T2 100 300 200 X=a; a=X; a=a+200; 获得X上的锁 释放X上的锁 释放X上的锁 获得X上的锁 b=X; b=b-100; X=b; b=X; 等待X上的锁
Synchronization 在Java语言中,通过被关键字 synchronized修 饰的方法或 synchronized语句块实现对代码 的同步 包含在 synchronized方法或语句块中的代码 称为被同步的代码( Synchronized code) 当线程访问被同步的代码时,必须首先竞争 代码所属的类的对象上的锁,否则线程将等 待(阻塞),直到锁被释放
Synchronization • 在Java语言中,通过被关键字synchronized修 饰的方法或synchronized语句块实现对代码 的同步 • 包含在synchronized方法或语句块中的代码 称为被同步的代码(Synchronized Code) • 当线程访问被同步的代码时,必须首先竞争 代码所属的类的对象上的锁,否则线程将等 待(阻塞),直到锁被释放