多线程-关键字Volatile
来源:互联网 发布:淘宝的优惠券是真的吗 编辑:程序博客网 时间:2024/06/05 19:38
关键字Volatile
如果只是对对象的域进行同步访问,我们可以使用volatile关键字。
域的访问安全有两种:
1. 标示为final的域。
2.域是volatile
3.对域的访问由公有的锁进行保护,例如synchronized关键词保护的。
- package com.test.www;
- public class mainTest {
- public static void main(String[] args) {
- //卖票的例子
- class Test implements Runnable {
- //volatile 关键词,保证了该域的读写安全
- private volatile int ticket = 10; //10张火车票
- @Override
- public void run() {
- int i = 10;
- while (i > 0) {
- i--;
- try {
- Thread.sleep(1000); //sleep 2秒
- } catch (Exception e) {
- }
- sale(); //卖一张票
- }
- }
- private void sale() {
- if (ticket > 0) {
- System.out.println(Thread.currentThread().getName() + "卖出一张票,剩余:" + ticket--);
- }
- }
- }
- Test test = new Test();
- new Thread(test, "A窗口").start();
- new Thread(test, "B窗口").start();
- new Thread(test, "C窗口").start();
- }
- }
结果:
A窗口卖出一张票,剩余:10
B窗口卖出一张票,剩余:9
C窗口卖出一张票,剩余:8
A窗口卖出一张票,剩余:7
B窗口卖出一张票,剩余:6
C窗口卖出一张票,剩余:5
A窗口卖出一张票,剩余:4
B窗口卖出一张票,剩余:3
C窗口卖出一张票,剩余:2
C窗口卖出一张票,剩余:1
关于死锁等
多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。导致死锁的根源在于不适当地运用synchronized关键词来管理线程对特定对象的访问。synchronized关键词的作用是,确保在某个时刻只有一个线程被允许执行特定的代码块,因此,被允许执行的线程首先必须拥有对变量或对象的排他性的访问权。当线程访问对象时,线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁。
死锁,主要还是需要自己的程序代码中去防范。
多线程中,我们一般不使用stop和suspend方法。stop方法是终止所有未结束的方法,包括run方法。当线程被终止,立即释放被他锁住的所有对象的锁,这会导致对象处于不一致的状态。
c语言调试死锁一般使用pstack命令;Java调试死锁一般使用jstack
0 0
- Java多线程 -- volatile关键字
- java多线程--volatile关键字
- 多线程之volatile关键字
- Java 多线程:volatile关键字
- volatile 多线程同步关键字
- 多线程-关键字Volatile
- 多线程之volatile关键字
- 多线程---volatile关键字
- java 多线程 volatile 关键字
- 多线程中的volatile关键字
- 多线程 volatile关键字
- 【java多线程 关键字】volatile
- 多线程 说说volatile关键字
- 多线程之volatile关键字
- Java多线程的volatile关键字
- JAVA 多线程之~~volatile关键字
- 多线程(五):Volatile 关键字
- java多线程之volatile关键字
- Python之二:几个数字库
- 四元数,欧拉角和旋转矩阵之间的互相转换
- js 页面埋点
- [Leetcode] Edit Distance
- HTTP 协议详解
- 多线程-关键字Volatile
- Intent跳转页面的几种方式
- 总结一下今天在编程中遇到的问题和相应的解决办法
- Servlet
- 还是杂
- earlysuspend调用过程
- QT学习--connect使用详解
- 极光推送的经验总结
- js知识