Java平台上进行多线程编程的缺陷

Scala语言的多线程编程 在现代软件开发中,随着多核处理器的普及,采用多线程编程的方式来提高程序运行效率已经成为一种趋势。Scala作为一种兼容Java的平台的多范式编程语言,具备了出色的并发编程能力。本文将深入探讨Scala语言的多线程编程,包括基础概念、常用库、最佳实践以及示例代码,帮助你更好地理解和使用Scala进行多线程开发。 阅读详情

转自:http://www.softhouse.com.cn/news/show/104219.html

Java平台上进行多线程编程的缺陷

     Java 语言的并发编程

  就其自身来说,并发编程是一种技术,提供了操作的同时执行,不论是在单一系统上还是分布在大量系统上。这类操作实际是一些指令顺序,例如单独某个顶级任务的子任务,这类操作能够并行执行,或者是作为线程,或者是作为进程。线程和进程之间的本质区别在于:进程通常是独立的(例如独立的地址空间),所以只能通过系统提供的进程间通信机制进行交互,而线程通常共享单一进程的状态信息,能够直接共享系统资源和内存中的对象。

  可以使用下面两种方法之一,通过多个进程来实现并发。第一种方法是在同一个处理器上运行进程,由操作系统处理进程之间的上下文环境切换。(可以理解,这种切换要比同一进程内多线程之间的上下文环境切换更慢。)第二种方法是构建大规模的并行和复杂的分布式系统,在不同的物理处理器上运行多个进程。

  从内建支持的角度来说,Java 语言通过线程提供并发编程;每个 JVM 都能支持许多线程同时执行。可以用以下两种方法之一在 Java 语言中创建线程:

  继承 java.lang.Thread 类。在这种情况下,已经重写的子类的 run() 方法必须包含实现线程运行时行为的代码。要执行这个代码,需要实例化子类对象,然后调用对象的 start() 方法,这样就可以在内部执行 run() 方法了。

  创建 Runnable 接口的定制实现。这个接口只包含一个 run() 方法,在这个方法中,要放置应用程序代码。要执行这个代码,需要实例化实现类的对象,然后在创建新 Thread 时,把对象作为构造函数的参数传入。然后调用新创建的线程对象的 start() 方法,开始执行控制的新线程。

  线程安全性和同步

  如果 Java 对象中的某个方法能够安全地运行在多线程环境中,那么就称该方法是 线程安全的。要获得这种安全性,必须有一种机制,通过该机制,运行同一方法的多个线程就能够同步其操作,这样,在访问相同的对象或代码行时,就会只允许一个线程被处理。这种同步要求线程使用叫作 信号 的对象彼此进行沟通。

  有一种类型的信号叫作 互斥信号 或 互斥体。顾名思义,这个信号对象的拥有权是互斥的,也就是说,在任意指定时间,只有一个线程能够拥有互斥体。其他想获得所有权的线程会被阻塞,它们必须等待,直到拥有互斥体的线程释放互斥体。如果多个线程按顺序排队等候同一互斥体,那么在当前拥有者释放它的时候,只有一个等候线程能够得到它;其他线程将继续阻塞。

  在 1970 年代初,C.A.R. Hoare 和其他人共同开发了一个叫作 监视器 的概念。一个 监视器 就是一个代码主体,它的访问受到互斥体的保护。任何想执行这个代码的线程,都必须在代码块顶部得到关联的互斥体,然后在底部再释放它。因为在指定时间只有一个线程能够拥有互斥体,所以这就有效地保证了只有拥有它的线程才能执行监视器的代码块。(受保护的代码不需要相邻 —— 例如,Java 语言中的每个对象都有一个与之关联的监视器。)

  任何想在 Java 语言中进行线程编程的开发人员,都会立即把上面的内容当成 synchronized 关键字所带来的效果。可以确保包含在 synchronized 块中的 Java 代码在指定时间只被一个线程执行。在内部,可以由运行时将 synchronized 关键字转换成某一种情况:所有的竞争线程都试图获得与它们(指线程)正在操作的对象实例关联的那个(惟一的一个)互斥体。成功得到互斥体的线程将运行代码,然后在退出 synchronized 块时释放互斥体。

    等候和通知

  wait/notify 构造在 Java 语言的线程间通信机制中也扮演了重要的角色。基本的想法是:一个线程需要的某个条件可以由另外一个线程促成。这样,条件的 wait 就可以得到满足。一旦条件为真,那么引发条件的线程就会 notify 等候线程苏醒,并从中止的地方继续进行。

  wait/notify 机制要比 synchronized 机制更难理解和判断。要想判断出使用 wait/notify 的方法的行为逻辑,就要求判断出使用它的所有方法的逻辑。一次判断一个方法,把该方法和其他方法隔离开,是对整体系统行为得出错误结论的可靠方式。显然,这样做的复杂性会随着要判断的方法的数量增长而迅速提高。

  线程状态

  我前面提到过,必须调用新创建的线程的 start() 方法来启动它的执行。但是,仅仅是调用 start() 方法并不意味着线程会立即开始运行。这个方法只是把线程的状态从 new 变成 runnable。只有在操作系统真正安排线程执行的时候,线程状态才会变成 running (从 runnable)。

  典型的操作系统支持两种线程模型 —— 协作式和抢占式。在协作式 模型中,每个线程对于自己对 CPU 的控制权要保留多久、什么时候放弃有最终意见。在这个模型中,因为可能存在某个无赖线程占住控制权不放,所以其他线程可能永远无法得到运行。在 抢占式 模型中,操作系统本身采用基于时钟“滴答”的计时器,基于这个计时器,操作系统可以强制把控制权从一个线程转移到另外一个线程。在这种情况下,决定哪个线程会得到下一次控制权的调度策略就有可能基于各种指标,例如相对优先级、某个线程已经等待执行的时间长短,等等。

  如果出于某些原因,处在 running 状态的线程需要等候某个资源(例如,等候设备的输入数据到达,或者等候某些条件已经设定的通知),或者在试图获得互斥体的时候被阻塞,因此线程决定睡眠,那么这时它可以进入 blocked 状态。当睡眠周期到期、预期输入到达,或者互斥体当前的拥有者将其释放并通知等候线程可以再次夺取互斥体时,阻塞的线程重新进入 runnable 状态。

  当线程的 run() 方法完成时(或者正常返回,或者抛出 RuntimeException 这样的未检测到异常),线程将终止。这时,线程的状态是 dead。当线程死亡时,就不能通过再次调用它的 start() 方法来重新启动它,如果那么做,则会抛出 InvalidThreadStateException 异常。

  四个常见缺陷

  正如我已经展示过的,Java 语言中的多线程编程是通过语言支持的大量精心设计的构造实现的。另外,还设计了大量设计模式和指导原则,来帮助人们了解这种复杂性带来的许多缺陷。除此之外,多线程编程会很容易地在不经意间把细微的 bug 带进多线程代码,而且更重要的是,这类问题分析和调试起来非常困难。接下来要介绍的是用 Java 语言进行多线程编程时将会遇到(或者可能已经遇到过)的最常见问题的一个列表。

  争用条件

  据说 争用条件 存在于这样的系统中:多个线程之间存在对共享资源的竞争,而胜出者决定系统的行为。Allen Holub 在他撰写的文章 “programming Java threads in the real world” 提供了一个带有这样 bug 的简单的多线程程序示例。在冲突的访问请求之间进行不正确同步的另一个更可怕的后果是 数据崩溃,此时,共享的数据结构有一部分由一个线程更新,而另一部分由另一个线程更新。在这种情况下,系统的行为不是按照胜出线程的意图进行,系统根本不按照任何一个线程的意图行动,所以两个线程最后都将以失败告终。

  死锁

  死锁 的情况是指:线程由于等候某种条件变成真(例如资源可以使用),但是它等候的条件无法变成真,因为能够让条件变成真的线程在等候第一个线程“做某件事”。这样,两个线程都在等候对方先采取第一步,所以都无法做事。

  活动锁

  活动锁 与 死锁 不同,它是在线程实际工作的时候发生的,但这时还没有完成工作。这通常是在两个线程交叉工作的时候发生,所以第一个线程做的工作被另一个线程取消。一个简单的示例就是:每个线程已经拥有了一个对象,同时需要另外一个线程拥有的另外一个对象。可以想像这样的情况:每个线程放下自己拥有的对象,捡起另外一个线程放下的对象。显然,这两个线程会永远都运行在上锁这一步操作上,结果是什么都做不成。(常见的真实示例就是,两个人在狭窄的走廊相遇。每个人都礼貌地让到另一边让对方先行,但却在相同的时间都让到同一边了,所以两个人还都没法通过。这种情况会持续一些时间,然后两个人都从这边闪到那边,结果还是一点进展也没有。)

    资源耗尽

  资源耗尽,又称为 线程耗尽,是 Java 语言的 wait/notify 原语无法保证 live-ness 的后果。Java 强制这些方法要拥有它们等候或通知的对象的锁。在某个线程上调用的 wait() 方法在开始等候之前必须释放监视器锁,然后在从方法返回并获得通知之后,必须再次重新获得锁。因此,Java 语言规范在锁本身之外,还描述了一套与每个对象相关的 等候集(wait set)。一旦线程释放了对象上的锁(在 wait 的调用之后),线程就会放在这个等候集上。

  多数 JVM 实现把等候线程放在队列中。所以,如果在通知发生的时候,还有其他线程在等候监视器,那么就会把一个新线程放在队列尾部,而它并不是下一个获得锁的线程。所以,等到被通知线程实际得到监视器的时候,通知该线程的条件可能已经不再为真,所以它不得不再次 wait。这种情况可能无限持续下去,从而造成运算工作上浪费(因为要反复把该线程放入等候集和从中取出)和线程耗尽。

  贪心哲学家的寓言

  演示这种行为的原型示例是 Peter Welch 教授描述的“聪明人没有鸡肉”。在这个场景中考虑的系统是一所由五位哲学家、一位厨师和一个食堂组成的学院。所有的哲学家(除了一位)都要想想(在代码示例中,考虑的时间是 3 秒)之后才去食堂取饭。而“贪心的”哲学家则不想把时间浪费在思考上 —— 相反,他一次又一次地回到食堂,企图拿到鸡肉来吃。

  厨师按照一批四份的定量准备鸡肉,每准备好一批,就送到食堂。贪心的哲学家不断地去厨房,但他总是错过食物!事情是这样的:他第一次到的时候,时间太早,厨师还没开火。因此贪心的哲学家只好干等着(通过 wait() 方法调用)。在开饭的时候(通过 notify() 方法调用),贪心的哲学家再一次回到食堂排队等候。但是这次,在他前来等候的时候,他的四位同事已经到了,所以他在食堂队列中的位置在他们后面。他的同事们把厨房送来的一批四份鸡肉全部拿走了,所以贪心的哲学家又要在一边等着了。 可怜(也可能是公平的) ,他永远处在这个循环之外。

  验证的问题

  一般来说,很难按照普通的规范对 Java 编程的多线程程序进行验证。同样,开发自动化工具对于常见的并发问题(例如死锁、活动锁和资源耗尽)进行完整而简单的分析也不太容易——特别是在任意 Java 程序中或者在缺乏并发的正式模型的时候。

  更糟的是,并发性问题出了名的变化多端、难于跟踪。每个 Java 开发人员都曾经听说过(或者亲自编写过)这样的 Java 程序:经过严格分析,而且正常运行了相当一段时间,没有表现出潜在的死锁。然后突然有一天,问题发生了,结果弄得开发团队经历许多的不眠之夜来试图发现并修补根本原因。

  一方面,多线程 Java 程序容易发生的错误非常不明显,有可能在任意什么时候发生。另一方面,完全有可能这些 bug 在程序中从不出现。问题取决于一些不可知的因素。多线程程序的复杂本质,使得人们很难有效地对其进行验证。没有一套现成的规则可以找出多线程代码中的这类问题,也无法确切地证明这些问题不存在,这些导致许多 Java 开发人员完全避开多线程应用程序的设计和开发,即使用并发和并行的方式对系统进行建模会非常棒,他们也不使用多线程。

  确实想进行多线程编程的开发人员通常准备好了以下一个或两个解决方案(至少是一部分):

  长时间艰苦地测试代码,找出所有出现的并发性问题,诚心地希望到应用程序真正运行地时候已经发现并修复了所有这类问题。

  大量运行设计模式和为多线程编程建立的指导原则。但是,这类指导原则只在整个系统都按照它们的规范设计的时候才有效,没有设计规则能够覆盖所有类型的系统。

  虽然知道的人不多,但是对于编写(然后验证)正确的多线程应用程序这一问题,还有第三个选项。使用称为通信顺序进程( Communicating Sequential Processes,CSP)的精确的线程同步的数学理论,可以在设计时最好地处理死锁和活动锁之类的问题。CSP 由 C.A.R. Hoare 与 20 世纪 70 年代后期设计,CSP 提供了有效的方法,证明用它的构造和工具构建的系统可以免除并发的常见问题。

  结束语

  在这份面向 Java 程序员的 CSP 全面介绍中,我把重点放在克服多线程应用程序开发常见问题的第一步上,即了解这些问题。我介绍了 Java 平台上目前支持的多线程编程构造,解释了它们的起源,讨论了这类程序可能会有的问题。我还解释了用正式理论在任意的、大型的和复杂的应用程序中清除这些问题(即竞争冒险、死锁、活动锁和资源耗尽)或者证明这些问题不存在的困难。

Java硬件编程(一):硬件编程是什么?Java能做什么? 硬件编程是通过编程语言直接控制物理设备(如微控制器、传感器等)的技术,涉及底层硬件交互和性能优化。Java凭借跨平台性、丰富类库(如pi4j、jSerialComm)和自动内存管理等优势,在物联网、智能家居和工业自动化领域广泛应用。典型场景包括树莓派传感器控制、智能温控系统和工业质检设备开发。虽然Java存在实时性不足和内存占用较高等局限,但通过JNI等技术仍能实现高效硬件控制。随着边缘计算和物联网平台发展,Java在硬件编程中的重要性将持续增强。 阅读详情

相关推荐

基于YOLOv11与Java的PCB缺陷自动标注系统开发

目标检测技术作为计算机视觉的核心任务,通过边界框定位和类别识别实现物体检测。YOLO系列算法因其实时性优势在工业质检领域广泛应用,最新YOLOv11版本通过GSConv等改进进一步提升了小目标检测精度。结合Java的跨平台特性与工程化能力,可构建高效的自动化标注系统。在PCB制造场景中,这类系统能显著提升缺陷检测效率,支持短路、断路等12类常见问题的识别。通过YOLOv11+LabelImg的技术组合,实现了98%的检测准确率和19.6倍的速度提升,为电子制造业的智能化转型提供了可靠解决方案。

weixin_28676181的博客 351

Java编程常见bug及解决方法

本文介绍了几种常见的Java编程bug,包括逻辑错误、空指针异常、数组越界异常和类型转换异常,同时也提供了相应的解决方法。此外,在多线程编程时,还需要注意并发问题,使用同步机制来保证共享资源的正确性。读者可以通过本文了解这些常见bug的出现原因和解决方法,避免在编写Java程序时出现这些问题。

weixin_43653660的博客 2133

Java硬件编程大纲(一):硬件编程是什么?Java能做什么?

硬件编程是通过编程语言直接控制物理设备(如微控制器、传感器等)的技术,涉及底层硬件接口交互,常用C/C++等语言。Java也可通过特定工具实现硬件控制,在物联网、工业自动化等领域应用广泛。Java的优势在于跨平台性、丰富类库和内存管理,但存在性能瓶颈和硬件访问限制。典型应用包括树莓派传感器控制、智能家居系统等。未来趋势包括边缘计算和物联网平台集成。尽管存在局限性,Java仍是连接数字与物理世界的重要工具,推动智能应用创新发展。

专业深耕,技术前沿 879

java线程的缺陷

Allen Holub 指出,Java 编程语言的线程模型可能是此语言中最薄弱的部分。它完全不适合实际复杂程序的要求,而且也完全不是面向对象的。本文建议对 Java 语言进行重大修改和补充,以解决这些问题。Java 语言的线程模型是此语言的一个最难另人满意的部分。尽管 Java 语言本身就支持线程编程是件好事,但是它对线程的语法和类包的支持太少,只能适用于极小型的应用环境。关于 Java 线程编程

df_world的专栏 941

【Java 多线程 1】java多线程并发编程

一、Synchronized保证原子性 public class Test { private static int number = 0; private static Object obj = new Object(); public static void main(String[] args) throws InterruptedException { Runnable increment = () -> { for (int

学Java,找哪吒 1万+

利用Java多线程机制实现带滚动字幕的时钟

当用户在“命令”后的文本框中输入“start clock”后,“现在的时间是”后的文本框开始显示系统时钟;当用户输入“stop clock”后,时钟终止显示。 (2)当用户在“命令”后的文本框中输入“fast”后,能够加速滚动字幕的显示;输入“slow”后,能够减慢字幕滚动;输入“stop”后,滚动字幕停止;输入“restart”后,滚动字幕重新开始滚动; (3)当用户在“命令”后的文本框中输入“change ”+字符串时,可更改字幕显示内容。如,输入“change 我可爱的小时钟”后,字幕变为“我可爱的小时钟”。

java缺陷_Java编程常见缺陷汇总(一)

[案例1】1 public booleanequalNode(JudgeNode a, JudgeNode b) {2 return a.getId() ==b.getId();3 }【点评】应在JudgeNode类里定义equals()方法(估计刚从面向过程语言"转行"过来...)。【案例2】1 publicString[] getMsg() {2 List msgList = ...

weixin_27872611的博客 701

LSTM模型 轨迹经纬度预测

原始时间序列数据如下所示,我们只取前两列纬度和经度作为输入数据 我们设定用前六个位置信息预测下一个位置,则两个样本的输入输出数据如下所示: 创建LSTM网络训练模型: import numpy as np from keras.layers.core import Dense, Activation, Dropout from keras.layers import LS...

Muzi_Water的博客 2万+

java 线程缺陷_Java多线程编程-使用线程的缺点

1、初始启动变慢在某些平台上创建和启动新线程是相对较慢的操作,在性能至上的应用程序中,这可能是很大的缺点。不过,线程池技术为这类问题提供了简单的解决方案,执行很多并发操作的应用程序通常会使用线程池,尤其是当应用程序操作的完成速度较快时更适合使用线程池。线程池的概念类似数据库连接池。2、资源利用每个线程都需要分配自身的栈,栈就是包含变量值和其他执行信息的存储区。除了栈之外,线程还要使用 其他系统资源...

weixin_34310322的博客 332

Web前端开发技术:实验14-16

实验14 1. 编写JavaScript程序实现“九九乘法口诀”表,如图14-40所示。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>九九乘法表</title> </head> <body> <h1>九九乘法表</h1> </body> <scri

KslgmrDry的博客 1万+

无感无刷电机控制进阶:反电动势过零检测的5种实现方案对比

本文深入探讨无感无刷电机控制中反电动势过零检测的5种实现方案,包括电阻分压虚拟中性点法、专用BEMF检测IC方案、基于ADC采样的数字锁相环、无传感器观测器技术及混合方案创新实践。通过对比分析各方案的优劣及适用场景,为电机控制工程师提供实用的技术选型指南,助力提升系统性能与成本效益。

weixin_28691741的博客 843

项目中常见的代码缺陷

1.Minor 行尾注释 2.Critical 圈复杂度过高,if else 嵌套过深。

m0_37788906的博客 605

基于STM32设计的老人摔倒检测报警系统(OneNet+MQTT)(235)

基于STM32设计的老人摔倒检测报警系统,不仅能够实时监测老人的位置信息,方便在紧急情况下快速定位,还能通过陀螺仪模块精确检测老人的身体姿态,一旦判断为摔倒状态,系统将立即触发蜂鸣器报警,并通过4G网络向指定联系人发送短信警示,确保老人能够迅速得到援助。此外,系统还支持老人主动按下设备上的按键发送求助短信,增强了系统的灵活性和实用性。

4690

在 Java 平台上进行多线程编程的缺陷

<br /> 在 Java 平台上进行多线程编程的缺陷 <br />Java 语言的并发编程 <br />  就其自身来说,并发编程是一种技术,提供了操作的同时执行,不论是在单一系统上还是分布在大量系统上。这类操作实际是一些指令顺序,例如单独某个顶级任务的子任务,这类操作能够并行执行,或者是作为线程,或者是作为进程。线程和进程之间的本质区别在于:进程通常是独立的(例如独立的地址空间),所以只能通过系统提供的进程间通信 机制进行交互,而线程通常共享单一进程的状态信息,能够直接共享系统资源和内存 中的对象。<b

goobycle 492

倍福EL6002实现RS232自由口通信,以称重模块RS232数据接收为例

RS-232是美国电子工业联盟制定的串行数据通信接口标准,原始编号全称是EIA-RS-232(简称RS232),它被广泛用于DCE(Data Communication Equipment ) 和 DTE(Data Terminal Equipment) 之间的连接。最早的台式电脑都会保留9针的232接口,用于串口通信,目前基本被USB接口取代。CTS是对请求发送RTS信号的响应,当DCE已经准备好接收数据时,该信号有效(ON),通知DTE可用使用TXD发送数据了。弄完了,再将CTS设置为1,让A发数据。

weixin_41883890的博客 1724

黑猫带你学UFS协议第13篇:UFS初始化详解(Boot Operation)

本文详细解析了UFS设备的初始化过程,包括部分初始化、加载启动代码(可选)和初始化完成三个阶段。重点介绍了如何通过设备描述符和逻辑单元描述符配置引导特性,以及如何从UFS设备加载启动代码。内容适用于嵌入式硬件和存储领域的开发者。

黑猫奥利奥的博客 3554

【转】 Java平台上进行多线程编程的缺陷

<br />Java平台上进行多线程编程的缺陷<br />http://www.webspherechina.net/club/viewthread.php?tid=17714<br /> <br />Java语言的并发编程<br /><br />  就其自身来说,并发编程是一种技术,提供了操作的同时执行,不论是在单一系统上还是分布在大量系统上。这类操作实际是一些指令顺序,例如单独某个顶级任务的子任务,这类操作能够并行执行,或者是作为线程,或者是作为进程。线程和进程之间的本质区别在于:进程通常是独立的(例如

strawbingo的专栏 1140

游戏“中台”的故事——架构演进、团队协同与产品创新的深度剖析

什么是中台?在游戏行业里,中台并不是把所有技术都归口管理、统一“圈养”。更不是简单的工具集合。它代表的,是一种“模块化底座”——把业务的通用能力、基础支撑和数据结合,变成可复用、可扩展、可创新的技术体系。让“前台”专注于创新玩法、极致体验;让“后台”稳健保障数据、安全、性能;让“中台”统合各种资源、流程、工具,形成平台型生产力。游戏中台是团队协同、技术创新、业务增长并行的产物。它让开发从重复劳动解脱,带着创新冲锋;让运营靠数据说话,精准制胜;让产品实现高效迭代,生态爆发。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1948

java多线程编程_阿里P8推荐金九银十进大厂必备:两大java线程与并发编程实战文档...

前言2020年,对程序员来说是一个非常大的挑战,同时也是充满机遇的,要看你自己怎么来把握!因为年初的时候,疫情还比较严重,许多互联网企业都被拖垮了,很多程序员被裁掉了,金三银四也给泡汤了!!估计,有的程序员已经在家里面坐了很久了,天天投简历,屡屡被拒,尤其武汉的程序员更加煎熬,在不知不觉中现在已经八月份了!虽然这已经是铁板的事实,但是你知道这现实的背后有多么可怕么?小编发现的一个点,就是不善于发现...

weixin_39950552的博客 134

挣脱枷锁:网页禁止复制/F12失效/右键失灵时的破局之道

大家在网上冲浪的否遇到过这种情况?急需网页上的一段关键信息、一段优美的文字、一个重要的代码片段,或者只是想收藏某篇文章,却发现:文本选择被阻止,右键菜单被禁用,开发者工具(F12)被屏蔽,查看源代码(Ctrl+U)失效?本文会有力解决这些封锁。

安德洛夫 2109

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java27岁了——我与Java初识

文章开始之前,首先要祝贺Java27岁生日快乐!在1995年的5月23日,太阳计算机系统公司在sunworld’95大会上公开发布了Java。而如今,Java已经成为当下在全世界范围内使用程度最广泛、使用人数最多的编程语言,被称为“计算机语言界的英语”,影响着每一个程序员对于编程语言的选择。

m0_61684063的博客 3382

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

双重检查锁(Double-Checked Locking)的缺陷

双重检查锁(Double-Checked Locking)被广泛用于多线程环境下实现延迟初始化实例,但是它其实是有缺陷的。

极客星云-优快云博客 6766

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

java ibm 多线程_IBM developerWorks 中国 : Java 多线程与并发编程专题

Java平台提供了一套广泛而功能强大的 API、工具和技术。其中,内建支持线程是它的一个强大的功能。这一功能为使用 Java编程语言的程序员提供了并发编程这一诱人但同时也非常具有挑战性的选择。本专题汇集了与 Java 多线程与并发编程相关的文章和教程,帮助读者理解Java 并发编程的模式及其利弊,向读者展示了如何更精确地使用 Java 平台的线程模型。第 1 部分,同步不是敌人在本系列的第 1 部...

weixin_42349182的博客 227
上一篇: JDom输出UTF-8的XML完美解决
下一篇: 高级线程开发(线程池、资源封锁和队列)
冯立彬
冯立彬 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域
博客等级 码龄21年 5458粉丝 593原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值