| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 线程安全问题的学习 -> 正文阅读 |
|
[Java知识库]线程安全问题的学习 |
目录 ?(2)synchronized保证线程安全(保证了原子性和内存可见性) 一.有关线程安全问题1.什么是线程安全多线程并发执行某个代码时,没有产生逻辑上的错误,就是线程安全的。 2.线程不安全的例子(1)运行结果(2)代码
(3)解释说明在代码中的++操作看起来只是执行了一次,但是实际上的++操作共有3步,为
3.导致线程不安全的原因
二.解决线程安全问题1.如何解决线程安全如果想解决线程安全问题,首先需要从导致线程安全的原因进行入手,而现在我们主要对原子性进行干预,其他的大多数还没有办法解决;为了保证原子性,我们引入了锁概念,如果一个线程没有执行完,有了锁之后,其他的线程如果需要访问,就会阻塞到那里,直到该线程放开锁,其他线程才有资格继续执行。 2.synchronized关键字(锁的学习)解决两个线程同时写的线程安全问题 (1)锁保证安全的例子?(2)synchronized保证线程安全(保证了原子性和内存可见性)synchronized是一个互斥锁,只有是同一把锁,才会起到作用,否则就没有效果。而且synchronized是对指定的某个对象来进行加锁的。 代码示例(刚才上面的加法操作进行加锁): 运行结果: 代码:
(3)关于synchronized锁的对象和位置1.synchronized修饰普通方法 ?2.synchronized修饰类方法 ?3.修饰代码块 ?(4)注意事项我们可以看出synchronized是锁的是对象,我们也可以自己new一个对象也可以作为锁进行使用。 对于没有获得锁的线程,会一直进行阻塞等待;这里阻塞等待的前提是需要线程持有的是同一把 锁,如果不是同一把锁,那么就不会产生竞争关系;从而也保证不了线程安全。 (5)了解java标准库中的线程安全和线程不安全的类1.线程不安全的类
2.线程不安全的类
3.volatile关键字(保证内存可见性)?解决一个线程读,一个线程写的线程安全问题。 (1)为什么使用该关键字可以保证内存可见性使用volatile修饰变量,目的是为了强制读写内存,因为有时候会出现当变量值发生改变后,由于没有及时的改变内存中的值,所以最终会导致与预期结果的值不同。 虽然使用了改关键字保证了内存可见性,但是保证不了原子性,对于之前的自增操作还是保证不了线程安全。 (2)没有内存可见性出现的问题以及如何解决内存可见性问题?代码:
三.线程中的wait(等待)和notify(通知)1.wait()和notify()如何使用首先这两个方法是Object类下的,其次wait和notify要搭配synchronized一块使用,否则直接使用会抛出异常。 2.wait的执行情况
3.notify的作用和注意事项通过调用指定对象的notify来使指定对象的wait结束等待,主要是用来唤醒等待的线程。 在使用notify后,当前线程不会立刻释放掉当前的锁,只有退出当前的synchronized代码块,才会释放对象锁。 4.有关wait和notify的方法
注意:在使用wait和notify时需要注意两个synchronized代码块需要持有相同的一把锁,否则就会通知失败。 其次notifyAll()虽然是唤醒所有线程,但是锁只有一个,还是需要进行竞争,最终结果也是只有一个线程可以获得该锁,所以和notify产生的结果是一样的,一般我们不会使用notifyAll来唤醒线程。 5.使用wait和notify的示例:(1)运行结果(2)代码
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 10:38:36- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |