毕向东讲解(摘)—5.多线程的安全问题(同步代码块)
来源:互联网 发布:小学生课外阅读软件 编辑:程序博客网 时间:2024/05/16 04:51
Java对于多线程的安全问题提供了专业的解决方式。
就是同步代码块:
Synchronized(对象)
{
需要被同步的代码;
}
对象如同锁,持有锁的线程可以在同步中执行。
没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁。
最经典的例子:火车上的卫生间。(对于多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其它线程不可以参与执行)
同步的前提:
1. 必须要有两个或者两个以上的线程。(单线程没有使用锁的必要,锁还要消耗资源)
2. 必须是多个线程使用同一个锁。(如果每个线程使用的锁不同,就没有锁的必要了)
多线程的同步代码块,是因为要保证多线程的安全而产生的,所以我们只在我们需要同步的地方进行加锁,如果将整个run中的代码都加锁了,那么这样实际是没有意义的,就又变回了单线程的状态。
因为同步中只能由一个线程在运行。
好处:解决了多线程的安全问题。
弊端:多个线程需要判断锁,较为消耗资源;越安全越麻烦,越消耗资源。
publicclassTest1
{
publicstaticvoidmain(String[]args)
{
Tickettk=newTicket();
Threadt1=newThread(tk);
Threadt2=newThread(tk);
Threadt3=newThread(tk);
Threadt4=newThread(tk);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
classTicketimplements Runnable
{
privateintticket=100;
Objectobj=newObject();
publicvoidrun()
{
while(true)
{
synchronized(obj)
{
if(ticket>0)
{
try{Thread.sleep(10);}catch(Exceptione){}
System.out.println(Thread.currentThread().getName()+"第"+ticket+"张票已经被卖出");
ticket--;
}
}
}
}
}
学习到线程加锁的情况之后,就开始了解到线程安全问题,线程安全考虑之后,就没有出现4张第100张票的情况了,考虑可能是因为电脑多核的原因。
- 毕向东讲解(摘)—5.多线程的安全问题(同步代码块)
- 毕向东讲解(摘)—7.多线程安全问题(同步函数的锁this验证)
- 毕向东讲解(摘)—6.多线程安全问题(同步函数)
- 多线程安全问题----同步代码块
- 黑马程序员——java中关于同步函数(或同步代码块)解决多线程安全问题的加锁
- 多线程_同步代码块的方式解决线程安全问题
- 多线程_同步代码块解决线程安全问题的解释
- 毕向东讲解(摘)—8.静态同步函数
- 毕向东讲解(摘)—11.多线程线程间通信(示例代码)
- java多线程㈡—线程安全问题(同步代码块or同步函数)
- 多线程(三)——多线程安全问题之同步代码块(Synchronized)
- 毕向东讲解(摘)—10.多线程(死锁)
- 毕向东讲解(摘)—1.多线程概述
- 多线程-线程安全问题的产生原因分析以及同步代码块的方式解决线程安全问题
- java多线程-多线程的安全问题-多线程同步代码块-锁Synchronized
- 04.多线程--04.【多线程卖票出现的数据安全问题】【同步代码块基本用法和原理】
- 黑马程序员----多线程2(安全问题、同步代码块、同步函数、死锁)
- 黑马程序员:多线程的介绍、应用及由安全问题引出的同步代码块介绍
- 【Data Structure/Algorithm】排序之归并排序
- 文件上传表单的视图解析器里都有啥子东东
- 压缩、复制保持目录和文件的属性不变
- 【深度学习】正则化入门
- 判断当前activity是不是在手机运行的的栈顶
- 毕向东讲解(摘)—5.多线程的安全问题(同步代码块)
- 【问题解决】关于找不到mysql服务
- css3实现图片划过一束光闪过效果(图片光影掠过效果)
- leetcode 215. Kth Largest Element in an Array
- [境内法规]中国人民银行反洗钱调查实施细则(试行)—银发[2007]158号
- Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'. > com.android.bui
- Choreographer 源码阅读笔记
- Ubuntu下Kubernetes源码编译
- # python学习笔记(二)--函数和异常处理