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;
}
}
}
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


