Java如何编写出线程安全的代码呢?

java-教程王 Java经验 发布时间:2022-04-09 08:43:50 阅读数:10899 1
下文笔者讲述java代码中编写线程安全的代码的方法分享,如下所示:

线程安全的概念

   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;
				}
			}

		}
	}
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202204/16494651082794.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者