首页 > 代码库 > 黑马程序员-学习日记(多线程的安全)
黑马程序员-学习日记(多线程的安全)
安全产生的原因:
当多条语句在操作同一个共享数据时,一个线程对多条语句只执行了一部分,还没有执行完, 另一个线程参与进来执行。导致共享数据的错误。
class Mlpc implements Runnable{ private int ticket = 50; public void run() { while(true) { if(ticket>0) { try { Thread.sleep(20); //让线程进入冻结状态 } catch (Exception e) { } System.out.println(Thread.currentThread()+" "+ticket--); } } }}class mlpcDemo { public static void main(String[] args) { Mlpc m = new Mlpc(); Thread th0 = new Thread(m); Thread th1 = new Thread(m); Thread th2 = new Thread(m); Thread th3 = new Thread(m); th0.start(); th1.start(); th2.start(); th3.start(); }}
出现了票数为-1和-2这样的结果。
解决办法:
针对多条线程将会操作共享数据的那条语句,每次只能让一个线程都执行完。在执行过程中,其他线程不可以参与执行。
方式:
同步代码块:
class Mlpc implements Runnable{ private int ticket = 50; Object obj = new Object(); public void run() { while(true) { synchronized (obj) { if(ticket>0) { try { Thread.sleep(20); } catch (Exception e) { } System.out.println(Thread.currentThread()+" "+ticket--); } } } }}
对象如同锁,持有锁的线程可以在同步中执行,没有持有锁的线程,即使获取cpu的执行权,也进不去,因为没有获取锁。
同步的前提:
1.必须要有两个或者两个以上的线程 2.必须多个线程必须使用同一个锁。 必须保证同步中只能有一个线程在运行。
好处:
解决了线程的安全问题
弊端:
消耗了资源,多个线程需要判断锁。
黑马程序员-学习日记(多线程的安全)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。