Java如何编写出线程安全的代码呢?
下文笔者讲述java代码中编写线程安全的代码的方法分享,如下所示:
火车票出售 同时有3个窗口,出售100张票
线程安全的概念
java中JVM的内存模型分为: 主内存和线程内存 主内存: 用于存放线程的共享变量(如:静态字段,实例字段) 线程内存: 每一个线程工作时,都有自己的私有内存空间 这些内存中存储线程私有变量(如:方法参数 局部变量) 当线程需操作主内存上的数据时 首先将主内存上的共享变量复制到线程内存中,然后在线程内存上修改,修改完毕后再返回到主内存上 这一操作,默认情况下是非原子性的,所以就会产生多线程操作主内存中的数据,就是出现数据错乱,输出的结果并不是我们所需的结果, 此时就需将这一操作修改为原子性 这就是多线程下的线程不安全现象 综上所述: 线程安全:当线程运行时,不会产生共享资源冲突,我们称之为线程安全 线程不安全:当多线程进行“共享资源”的抢夺, 就有可能会发生“数据错误”,不是我们预期的结果,我们称之为“线程不安全”
如何解决线程不安全的这个异常呢?
将共享资源上锁,使其它线程无法进入,此时就可实现线程安全,使程序按照我们预期的路径进行运行 常见的实现线程安全的手段有如下所示: 同步代码块 同步方法 Lock ReentrantLock实现类例:
火车票出售 同时有3个窗口,出售100张票
package com.java265.other; public class DuoXianCheng { /** * java265.com 多线程的示例分享 */ public static void main(String[] args) { TicketThread ticketThread = new TicketThread(); Thread t1 = new Thread(ticketThread, "线程-1"); Thread t2 = new Thread(ticketThread, "线程-2"); Thread t3 = new Thread(ticketThread, "线程-3"); t2.start(); t1.start(); t3.start(); } } class TicketThread extends Thread { public static int ticketCount = 1000; @Override public void run() { while (true) { // 加入锁,可使每次只有一个线程运行 synchronized (this) { try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (TicketThread.ticketCount > 0) { System.out.println("线程名:" + Thread.currentThread().getName() + " " + TicketThread.ticketCount); TicketThread.ticketCount--; } else { break; } } } } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。