`
雨过天晴0521
  • 浏览: 159405 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转)关于多线程

 
阅读更多
多线程总结一:基本概念


一.普通对象,线程对象,线程

普通对象:针对于线程对象而言的。到处可见普通对象,Person p = new Person();一个无头无脑的人就是一个普通对象。

线程对象:线程类的实例对象。我自己定义了一个线程类public class CheckThread extends Thread{...},然后CheckThread ct = new CheckThread(),ct就是线程对象。

线程:代码的一次执行过程。

从概念层面讲,普通对象和线程对象是实实在在的东西,线程是虚的东西。线程好比一条细线。把普通对象和线程对象上的方法串起来执行,得到想要的结果而已。
从内存层面讲,对象就是一块内存地址,里面有数据和运行方法。而线程就是这些方法的一次执行路径。
唯一觉得线程对象和线程有点关系的地方:线程对象定义了线程的一个入口(线程对象的run方法),就好像main方法开启了主线程的一个入口一样。

二.锁和同步

锁是针对对象或者类而言的。Java中每个对象都有一个内置锁。

同步的表现形式为在一个方法前加synchronized关键字,作用为同一时刻,只能有一个线程调用此方法,谁获得了对象锁或类锁,谁就能调用此方法。当程序运行到synchronized同步方法或代码块时才锁才起作用。

类锁:Xxx.class。同一时刻多个线程都想调用setName方法的时候,谁先拿到Xxx类的类锁,谁就能调用。

public static synchronized int setName(String name){  
      Xxx.name = name;  
}  
等价于  
public static int setName(String name){  
      synchronized(Xxx.class){  
            Xxx.name = name;  
      }  
}  


对象锁:this。

public synchronized int getX() {  
        return x++;  
}  
等价于  
public int getX() {  
        synchronized (this) {  
            return x;  
     }  
 }
 

线程1对静态同步方法的调用用到类锁,线程2对非静态同步方法的调用用到对象锁,它们之间不会产生阻塞。
一个对象可以同步方法和非同步方法同时存在,线程对同步方法的调用需要获得锁,对非同步方法的调用不需要。
线程1在获得对象A的锁后,正在调用同步方法a,恰好线程2也想调用方法a,因为锁只有一把,所以线程2没法调用方法a,此时线程2进入锁池队列。直到线程1完成对方法a的调用(synchronized结束),释放锁,线程2才能做接下来的事情。
记住一句话:线程想要调用对象或类的同步方法,必须先获得对象或类的锁。
分享到:
评论

相关推荐

    springboot 文件转换PDF多线程

    根据网上的资料总结的一个springboot 转换pdf Word文档大小最好2m以下 需要安装OpenOffice.org 3.3 链接:https://pan.baidu.com/s/1onrkhBCNlGLEmf3hPwzXWw 密码:8h5a

    office文档通过openoffice或者microsoft多线程转换成pdf文档并通过pdfjs显示

    标题提到的"office文档通过openoffice或者microsoft多线程转换成pdf文档"涉及到的技术主要包括办公软件API接口利用、多线程处理以及文件转换技术。首先,OpenOffice和Microsoft Office都提供了能够读取和操作Office...

    多线程基础与基于多线程的简单聊天室

    在IT行业中,多线程是程序设计中的一个重要概念,尤其在Java编程中,它被广泛应用于提高应用程序的并发性能和响应速度。本压缩包“多线程基础与基于多线程的简单聊天室”提供了对多线程技术的实践理解和二次开发的...

    Arduino 使用多线程例子

    标题中的“Arduino 使用多线程例子”意味着我们将探讨如何在Arduino平台上实现多任务并行处理。通常,Arduino基于单片机,不直接支持操作系统或内置的多线程机制。但是,通过巧妙编程和使用库,我们可以模拟多线程的...

    PB多线程实现

    本文将详细探讨PB(包括PB9、PB12.5以及PB.NET)实现多线程的方法。 一、PB9的多线程实现 在PB9中,虽然官方并未直接支持多线程,但开发者可以通过使用Windows API函数来实现。一种常见的方式是创建一个新的窗口类...

    C#泛型参数多线程与复杂参数多线程2

    最近用多线程用的比较多自己走了一些弯路,分享出来希望大家少走弯路,C#中的多线程有两个重载,一个是不带参数的,一个是带参数的,但是即便是带参数的多线程也不支持泛型,这使得使用泛型参数多线程的时候很不方便...

    delphi多线程调用dll

    在Delphi编程中,多线程技术被广泛用于提高应用程序的执行效率,特别是在处理大量数据或执行长时间操作时。DLL(动态链接库)是Windows操作系统中的一个重要组件,它允许代码和资源在多个程序之间共享。当需要在多...

    java 多线程操作数据库

    ### Java多线程操作数据库:深入解析与应用 在当今高度并发的应用环境中,Java多线程技术被广泛应用于处理数据库操作,以提升系统的响应速度和处理能力。本文将基于一个具体的Java多线程操作数据库的应用程序,深入...

    稳定、方便、实用的VB6多线程技术(附老马的ActiveX多线程示例)

    多线程技术是现代软件开发中的重要概念,它允许程序同时执行多个任务,从而提高效率和响应性。VB6虽然相对老旧,但其支持的多线程功能依然具有实用性,尤其是在处理耗时操作或需要并发执行任务的应用场景。 VB6中的...

    关于C#多线程的函数示例

    在C#编程中,多线程是一个核心概念,特别是在处理并发任务、提高应用程序性能和响应速度时至关重要。本文将深入探讨C#中的多线程,包括如何创建不带参数和带参数的线程函数。 首先,让我们理解什么是线程。线程是...

    多线程发邮件

    在IT行业中,多线程技术是一项重要的编程技巧,特别是在处理并发任务时,它能显著提升程序的执行效率。本示例“多线程发邮件”就是利用了这一特性,通过并发执行多个邮件发送任务,来加快邮件的发送速度。下面我们将...

    多线程面试题

    在Java编程领域,多线程是面试中常见且重要的知识点,尤其对于系统设计和高并发处理的岗位至关重要。本文将围绕“多线程面试题”这一主题,深入探讨相关概念、技术及其应用。 1. **线程的概念**:线程是程序执行的...

    FFmpegH264 多线程 优化

    本项目专注于FFmpeg中的H264解码库,通过引入多线程和硬件加速技术如MMX、SSE(Streaming SIMD Extensions)和AVX(Advanced Vector Extensions),来提升解码性能和效率。 多线程技术在FFmpeg中的应用主要是为了...

    java实现多线程文件传输

    在Java编程语言中,实现多线程文件传输是一种优化程序性能、提高系统资源利用率的有效方法。多线程允许我们同时处理多个任务,这对于大文件传输或需要并行处理的场景尤其有用。本篇文章将深入探讨如何使用Java实现多...

    vb模拟多线程 本地Timer对多线程

    在VB(Visual Basic)编程环境中,由于其原生特性不直接支持多线程,开发者往往需要借助外部API(应用程序接口)来实现多线程功能。标题提到的“vb模拟多线程 本地Timer对多线程”就是一种常见的解决策略,通过使用...

    多线程采集C#源代码(转)

    本资源“多线程采集C#源代码”显然是一个关于如何利用C#进行多线程数据采集的示例项目。下面将详细探讨多线程采集的核心概念、C#中的多线程实现以及可能涉及的关键技术。 1. **多线程基础**:多线程是指在一个进程...

    多线程demo/java多线程练习

    本项目"多线程demo/java多线程练习"旨在通过实际操作来深入理解和掌握多线程技术,同时模拟数据库操作,这在现代应用程序开发中至关重要。 1. **线程基础** - **创建线程**:Java提供了两种创建线程的方式,分别是...

    linux多线程编程.pdf

    Linux多线程编程是操作系统中并发程序设计的一个重要领域,它允许开发者在同一程序中创建多个线程,以实现并行执行,从而提高程序的执行效率和响应能力。Linux下的多线程编程通常基于POSIX线程(pthread)库来实现,...

    并发服务器-多线程服务器详解

    ### 并发服务器—多线程服务器详解 #### 一、引言 在现代软件开发中,特别是网络应用和服务的设计中,对并发处理能力的需求日益增长。为了满足高并发访问的需求,开发人员常采用多线程技术来构建高效、响应迅速的...

Global site tag (gtag.js) - Google Analytics