java 线程 以及wait()和notify()
来源:互联网 发布:mysql 最近一条记录 编辑:程序博客网 时间:2024/04/27 01:57
线程:
同步方法:在同一个进程内多个线程共享内存空间、共享资源,以某顺序来确保该资源在某一个只被一个线程使用。一个对象只有一把与之对应的“对象锁”,线程获得该对象锁,其他线程希望拿到那把锁,只能等待该线程释放对象锁。获得对象锁 有关键字syschronized
1)实现方法同步:将关键字syschronized添加到方法的声明中
某线程想调用对象中被syschronized修饰的方法,先获得该对象的对象锁,然后再执行方法。其他线程调用该方法的线程被阻塞和暂停执行,直至第一个线程释放对象锁(方法执行完之后对象锁自动释放)
非syschronized修饰的方法在同一时间只能被多个线程执行。
有syschronized修饰的方法在同一时间只能被同一个线程执行。
2)若共享的是静态数据,利用静态同步方法来保护静态数据
3)类锁:每个类都有一个类锁,两个线程不能同时执行同一个类上的静态方法。一个调用同步静态方法的同步实例方法可获得2个锁(先去到同步实例方法的对象锁,再取到同步静态的类锁,实例方法比静态方法先调用)
4)不要对run()方法进行同步,供多个线程并行执行。
start()::native 关键字说明是原生函数,用c/c++实现的,用做java 和其他语言(如c++)进行协作时用的 也就是native 后的函数的实现不是用java, native funtion():是操作系统函数,java只能调用。native不能和abstract关键字一起用,native的方法可以创建实例。
native是和操作系统和java外部环境交互
------------------------------------------------------------------------------------------------------
因为wait和notify方法定义在Object类中,因此会被所有的类所继承。这些方法都是final的,即它们都是不能被重写的,不能通过子类覆写去改变它们的行为。
wait()方法:使得当前线程必须要等待,等到另外一个线程调用notify()或者notifyAll()方法。
当前的线程必须拥有当前对象的monitor,也即lock,就是锁。
线程调用wait()方法,释放它对锁的拥有权,然后等待另外的线程来通知它(通知的方式是notify()或者notifyAll()方法),这样它才能重新获得锁的拥有权和恢复执行。
要确保调用wait()方法的时候拥有锁,即,wait()方法的调用必须放在synchronized方法或synchronized块中。
一个小比较:
当线程调用了wait()方法时,它会释放掉对象的锁。
另一个会导致线程暂停的方法:Thread.sleep(),它会导致线程睡眠指定的毫秒数,但线程在睡眠的过程中是不会释放掉对象的锁的。
notify()方法
notify()方法会唤醒一个等待当前对象的锁的线程。
如果多个线程在等待,它们中的一个将会选择被唤醒。这种选择是随意的,和具体实现有关。(线程等待一个对象的锁是由于调用了wait方法中的一个)。
被唤醒的线程是不能被执行的,需要等到当前线程放弃这个对象的锁。
被唤醒的线程将和其他线程以通常的方式进行竞争,来获得对象的锁。也就是说,被唤醒的线程并没有什么优先权,也没有什么劣势,对象的下一个线程还是需要通过一般性的竞争。
notify()方法应该是被拥有对象的锁的线程所调用。
(This method should only be called by a thread that is the owner of this object's monitor.)
换句话说,和wait()方法一样,notify方法调用必须放在synchronized方法或synchronized块中。
wait()和notify()方法要求在调用时线程已经获得了对象的锁,因此对这两个方法的调用需要放在synchronized方法或synchronized块中。
一个线程变为一个对象的锁的拥有者是通过下列三种方法:
1.执行这个对象的synchronized实例方法。
2.执行这个对象的synchronized语句块。这个语句块锁的是这个对象。
3.对于Class类的对象,执行那个类的synchronized、static方法。
- java 线程 以及wait()和notify()
- Java 线程 wait notify
- Java 线程的 wait()和notify()
- java线程中wait和notify 辨别
- [Java] 线程之wait和notify
- JAVA线程同步wait()和notify()讲解
- Java线程基础(三):线程调度以及wait/notify
- java 中的wait和notify以及synchronized的使用,实现两个线程交替执行
- Java线程和多线程(二)——对象中的wait,notify以及notifyAll方法
- JAVA 线程状态以及synchronized,wait,sleep,yield,notify,notifyAll
- JAVA线程状态以及synchronized,wait,sleep,yield,notify,notifyAll
- java wait和notify
- Java线程wait()与notify()
- java线程wait、notify、notifyAll
- java 线程同步 notify wait
- JAVA -- 线程wait()、notify()、notifyAll()
- JAVA线程 -- wait notify notifyAll
- java线程:wait,notify,notifyAll
- ERP各个模块的缩写
- 软件工程之软件设计
- 工具美化
- iOS 通知机制 Notifications (一)
- Oracle增加表空间
- java 线程 以及wait()和notify()
- 海上發展 (朝鮮歷史 韓長庚)
- 74 Open Source VoIP Apps & Resources
- C陷阱篇之移位运算
- 以Android环境为例的多线程学习笔记(一)------- 线程的创建
- Android怎样才能完全退出程序
- 代码块同步
- 成为IT精英,我奋斗了7年
- NYOJ 31 5个数求最值