毕向东讲解(摘)—5.多线程的安全问题(同步代码块)
2017-10-12 16:42
295 查看
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张票的情况了,考虑可能是因为电脑多核的原因。
就是同步代码块:
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张票的情况了,考虑可能是因为电脑多核的原因。
相关文章推荐
- 毕向东讲解(摘)—7.多线程安全问题(同步函数的锁this验证)
- 基础篇_线程 第4集 多线程的安全问题--解决之道同步代码块
- 04.多线程--04.【多线程卖票出现的数据安全问题】【同步代码块基本用法和原理】
- 黑马程序员——java中关于同步函数(或同步代码块)解决多线程安全问题的加锁
- java 多线程安全问题-同步代码块
- 多线程(三)——多线程安全问题之同步代码块(Synchronized)
- 多线程安全问题----同步代码块
- 黑马程序员:多线程的介绍、应用及由安全问题引出的同步代码块介绍
- java中多线程安全问题产生&解决方案——同步代码块
- java多线程-多线程的安全问题-多线程同步代码块-锁Synchronized
- 多线程安全开启问题,同步和异步
- 多线程——用同步代码块解决经典储户银行存钱问题
- Servlet多线程安全问题
- 多线程三,同步函数、静态同步函数和单例设计模式中懒汉式即延迟加载模式的多线程问题(毕向东老师)
- java基础-多线程的安全问题
- 学习进度表 +解决单利设计模式懒汉式在多线程的安全问题
- 多线程_同步代码块的方式解决线程安全问题
- 多线程安全问题。
- 浅析libcurl多线程安全问题
- 并行方法之多线程生产者与消费者问题的逻辑讲解