`

多线程基础-线程安全

 
阅读更多

在多线程开发中线程安全是需要处理的,项目中会碰到很多这种问题。

1 变量共享

例子1:

public class SecThread extends Thread{
	private int count = 99;
	public SecThread(String name) {
		this.setName(name);
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		super.run();
		count--;
		System.out.println(Thread.currentThread().getName()+" count:"+count);
	}
	public static void main(String[] args) {
		SecThread at = new SecThread("A");
		SecThread bt = new SecThread("B");
		at.start();
		bt.start();
	}
}

 从结果看变量显然没有共享,共享变量目的是为了让多个线程对同一个变量操作,例子里他们都有各自的count

  换一种方式

 

    public static void main(String[] args) {   
        SecThread st = new SecThread();   
        Thread at = new Thread(st,"A");
        Thread bt = new Thread(st,"B");
        at.start();
        bt.start();
    }  

 执行结果出乎意料。98 97, 97 97 不知道下一步是产生哪个结果。

上面例子的变量都不安全。

解决方法 加synchronized关键字,这样的话多线程在执行run的时候,会先去判断一下是否被上锁,如果上锁了,说明其他线程在调用着,需要等待其他线程调用玩才可以执行run

该例有2个线程去争夺锁,如果拿得到就去执行同步代码块,如果拿不到就会一直尝试拿锁,知道拿到了再去执行同步代码块。

 

分享到:
评论

相关推荐

    Java多线程基础-01、数组概述.rar

    本资料“Java多线程基础-01、数组概述”将带你入门Java的多线程世界,并结合数组这一基本数据结构进行讲解。 首先,我们需要理解什么是线程。线程是操作系统分配CPU时间的基本单位,一个进程可以有多个线程,它们...

    多线程实例-摇奖机源码

    在IT行业中,多线程是一种常见的编程技术,它允许程序同时执行多个独立的任务,从而提高计算机系统的效率和响应性。...通过分析和运行这个源码,你可以深入掌握多线程编程的基础,并为以后的项目开发打下坚实的基础。

    Java多线程基础-02、数组定义方式一、访问、注意事项.rar

    在Java编程语言中,多线程是程序设计中的一个重要概念,尤其在处理高并发和资源优化的场景下...通过观看"Java多线程基础-02、数组定义方式一、访问、注意事项.mp4"这个视频教程,你将能更深入地学习这些重要的知识点。

    VB多线程实例 - VBThread2

    1. **线程基础知识**: - **线程**:线程是程序执行的基本单元,每个线程代表程序中的一个独立的控制流,可以并行执行。 - **主线程**:应用程序启动时默认创建的线程,负责处理用户界面交互。 - **工作线程**:...

    Java多线程基础-03、数组定义方式二、元素默认值规则.rar

    本节我们将深入探讨Java中的多线程基础,特别是数组的定义方式及其元素的默认值规则。 首先,让我们了解什么是Java多线程。在单线程环境中,程序的执行是按顺序进行的,而多线程则允许多个任务同时执行。在Java中,...

    多线程--下载---后台运行

    在多线程和后台服务的基础上,我们可以使用各种下载库和API来优化下载过程。例如,Android的DownloadManager API提供了一个系统级别的服务,可以处理文件的下载,包括自动恢复中断的下载、优先级管理以及通知用户...

    多线程开发--基本多线程

    这是为了确保用户界面的响应性和线程安全性,因为同一时刻只有一个线程能更新用户界面。用户界面线程是负责显示和更新应用程序窗口、响应用户操作的关键部分。 在Win32 API编程中,工作者线程和用户界面线程在创建...

    05.多线程编程基础-使用多线程-成员变量与线程安全.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    MFC多线程编程实例----多线程画线源码

    1. **线程基础**:在计算机科学中,线程是操作系统分配处理器时间的基本单位。一个进程中可以包含多个线程,它们共享同一内存空间,但拥有独立的执行路径。多线程可以提高程序的并发性,从而提高系统资源的利用率。 ...

    C#多线程基础教程--

    本教程将深入探讨C#中的多线程基础知识,以及如何通过实例来实现线程的控制和通信。 首先,我们需要理解线程的基本概念。在操作系统中,线程是执行单元,它代表程序的一个执行流程。每个线程拥有自己的栈空间,用于...

    11-多线程爬虫-1(1).zip

    一、多线程基础 多线程是指一个程序内可以同时执行多个不同的任务或路径。在计算机系统中,线程是CPU调度的基本单位,多个线程可以在同一进程中并发运行,共享进程资源。通过多线程,我们可以并行处理任务,提高程序...

    C++面向对象多线程编程-pdf

    - 线程同步:包括互斥量(`std::mutex`)、条件变量(`std::condition_variable`)、信号量(`std::semaphore`)等,确保线程安全。 - `std::async`和`std::future`:异步执行任务,并提供结果获取机制。 - 线程...

    【IT十八掌徐培成】Java基础第17天-04.多线程复制-1avi.zip

    总的来说,徐培成老师的这堂课将帮助初学者深入理解Java多线程编程的基础知识,掌握多线程复制的具体实现,以及如何在实际开发中有效地利用多线程提升程序性能。通过学习,你将能够创建安全、高效的多线程Java应用,...

    进程与线程--小练习

    线程的创建、销毁和切换相比进程更快速,因此多线程常用于提高程序的并发性能。 进程与线程的主要区别在于资源分配和独立性。进程是资源分配的基本单位,而线程是调度的基本单位。一个进程内的多个线程可以并发执行...

    多线程-day02.docx

    1. **程序计数器**:每个线程都有自己的程序计数器,存储当前线程执行的内存地址,线程安全且互不影响。 2. **Java栈**(虚拟机栈):每个线程都有一个Java栈,由多个栈帧组成,每个方法对应一个栈帧。栈帧在方法...

    面试-Java一些常见面试题+题解之多线程开发-JavaConcurrent.zip

    了解每个状态的含义及其转换,是理解多线程运行机制的基础。 3. **线程同步** - 同步是为了避免多个线程同时访问共享资源导致的数据不一致。Java提供了synchronized关键字,它可以修饰方法或代码块,实现临界区的...

    Java高级程序设计实验代码-多线程版-FTP服务器设计与实现.zip

    全面的FTP服务器实现: ZIP文件中包含了一个完整的FTP服务器的源代码,涵盖了FTP协议的基础实现、多线程编程技巧、服务器性能优化、数据传输安全等各个方面。这意味着读者可以深入研究代码,了解每个功能的实现方式,...

    iOS多线程编程指南(一)关于多线程编程 - 51CTO.COM1

    1. **多线程基础** 多线程是指在一个应用程序中同时执行多个独立的执行流,每个执行流被称为一个线程。在iOS中,多线程可以用于在主线程执行UI更新的同时进行其他后台任务,避免阻塞用户界面,提升应用性能。 2. *...

Global site tag (gtag.js) - Google Analytics