1.原子性,原生数据类型的一般操作都是Atomic(原子性的),除了double,long这两个类型,因为在32位的CUP的操作系统中,处理64位的数据类型不可能原子性。
另外,自增、自减运算不是原子性的,如int a =0; a++;其中a++就是非原子性的。
问:为什么要原子性?原子性的操作不存在线程安全问题……
2.可见性,可见性是指多个线程在竞争资源时,正在被某个线程使用的资源,其他线程能够看到(能够看到变化)。Volatile为关键字。(是否会引起同步问题?)
3.守护线程:又叫寄生线程,特殊的线程,主线程运行完了,守护线程生命周期结束;主线程没结束,守护线程自己运行完了生命周期结束。从寄生线程的生命周期的特征决定了它一般不能用来驱动主要的任务。
4.线程池:
1) 捕获异常:下面的例子将不能捕获异常:
(1) 不加try-catch
package org.bbjava.concurrency.catching_exceptions;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExceptionThread implements Runnable {
@Override
public void run() {
throw new RuntimeException();
}
public static void main(String []args){
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new ExceptionThread());
}
}
(2)加try-catch语句
package org.bbjava.concurrency.catching_exceptions;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class NativeExceptionHandling {
public static void main(String[] args) {
try {
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new ExceptionThread());
} catch (RuntimeException ue) {
//This statement will not execute!
System.out.println("Exception has been handled!");
}
}
}
综上,可知用线程池方式抛出的异常,线程池外捕获不了异常
2) 通过Thread.UncaughtExceptionHandler、ThreadFactory接口完成捕获线程池抛出的异常。eg:《thinking in java》concurrency部分。
5.使用具体的Lock对象,
问:Lock与synchronized有什么不一样么?2011-10-16:现在只知道Lock比synchronized灵活。
6.使用synchronized关键字,使用synchronized块。
在同一个对象里面synchronize的方法,会互斥。
如果这样用synchronized块,synchronized(new AnyOtherClass()){}则不会发互斥。
7.线程返回值
package org.bbjava.concurrency.producingreturnvalue;
import java.util.concurrent.Callable;
public class TaskWithResult implements Callable<String> {
private int id;
public TaskWithResult(int id) {
this.id = id;
}
@Override
public String call() throws Exception {
return "result of TaskWithResult" + id;
}
}
package org.bbjava.concurrency.producingreturnvalue;
import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class CallableDemo {
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
ArrayList<Future<String>> results = new ArrayList<Future<String>>();
for (int i = 0; i < 10; i++) {
results.add(exec.submit(new TaskWithResult(i)));
}
for (Future<String> fs : results)
try {
System.out.println(fs.get());
} catch (ExecutionException e) {
System.out.println(e);
return;
} catch (InterruptedException e) {
} finally {
exec.shutdown();
}
}
}
8.前面说到过实现Runnable接口创建线,其实还有一种线程就是Callable接口,该线程可以返回值,以前的Thread,Runnable都是不能返回值的。
9.Thread.join(),Thread.yeild(),Thread.sleep(),这些方法的作用。
10.你不能中断正在正在尝试获得sychronized锁的线程(task)或者是正在尝试执行I/O的线程。由其你创建一个执行I/O的任务而中断前面的I/O线程(task),那将是一种破坏,因为这意味着那样的I/O有潜在锁住多线程的程序的可能性。
分享到:
相关推荐
### 小结 Java集合框架为开发者提供了丰富的数据结构选择,每种数据结构都有其特定的优势和适用场景。理解这些集合的内部实现机制和性能特点,对于编写高效、可维护的代码至关重要。当面临具体问题时,应根据数据的...
### Java个人学习小结 #### Java发展史及重要里程碑 - **起源与发展**: Java 的起源可以追溯到 1992 年,当时的 Sun Microsystems 公司开发了一种名为 Oak 的编程语言,最初是为了家用电器的智能化而设计的。然而...
这个“java课程小结.rar_北京理工大学JAVA课程”压缩包中包含的“课程小结”文件,很可能是教授精心编写的教学精华,旨在帮助学生巩固所学知识并为后续学习打下坚实基础。 在Java课程中,有几个核心概念和技术是必...
### Java基础知识小结 #### 1.1 `getPath()`、`getAbsolutePath()`、`getCanonicalPath()`的区别 在Java中,处理文件路径时经常会用到`getPath()`、`getAbsolutePath()`以及`getCanonicalPath()`这三个方法。它们...
### Java多线程小结 #### 一、多线程的概念与意义 多线程是Java编程中的一个重要概念,指的是程序在运行时可以同时执行多个线程的能力。它能够提高程序的性能,尤其是在多核处理器的环境下。多线程使得程序能够更...
本文将对Java垃圾回收进行小结,探讨其基本原理、类型以及常见算法。 1. 基本原理: Java中的内存分为堆(Heap)和栈(Stack)两部分,垃圾回收主要关注堆内存。当一个对象不再被任何引用指向时,它被视为可回收的...
Java 高并发锁的 3 种实现示例代码 ...小结 本文介绍了 Java 高并发锁的 3 种实现示例代码,分别是乐观锁、悲观锁和 CopyOnWrite 机制。每种机制都有其特点和适用场景,选择合适的锁机制是非常重要的。
为了全面理解Java基础知识,本小结将按照给定的文件名,逐一解析关键知识点。 1. **Java基础知识** 这一部分通常包括Java语言的基础语法,如变量、数据类型、运算符、流程控制(if语句、switch、for、while循环等...
#### 四、小结 Java多线程并发技术的核心在于正确地创建和管理线程,以及合理地处理线程间的数据共享问题。通过理解线程的创建方式、状态变化及同步机制,开发人员可以有效地利用Java的多线程功能,提高程序的并发...
### Java笔试题小结 #### 1. Java 字符串(String) **问题**: String 类的特点是什么?与 StringBuffer 的区别? **分析与解答**: `String` 类在 Java 中是不可变的,即一旦创建了一个字符串对象,其内容就不能...
在Java编程语言中,线程是程序执行的基本单元,它允许程序并发地执行多个任务。本文将对Java线程类进行深入的总结,并通过思维导图帮助理解各个类之间的关系。我们将探讨`Thread`类、`Runnable`接口、线程的状态、...
为了实现群聊,我们需要处理多个客户端的并发连接,这需要用到多线程技术,每个客户端连接对应一个服务线程,确保服务器可以同时处理多个用户的请求。 在Java中,`java.net.Socket` 和 `java.net.ServerSocket` 类...
小结 本文通过一个银行用户取钱的实例,演示了java编程多线程并发处理场景,我们讲解了Account类和DrawThread类的实现,讨论了多线程并发处理、线程安全和并发编程等概念,希望对读者有所帮助。
然而,现代的多线程编程通常更倾向于使用并发集合,如`java.util.concurrent.CopyOnWriteArrayList`,它在读多写少的场景下有更好的性能。 6. **编程高手箴言** - 虽然`Vector`提供了线程安全,但其性能可能不满足...
通过这个实验,你可以掌握Java网络编程的基本技巧,理解I/O操作和多线程在并发通信中的作用,并能设计和实现一个简单的网络应用。这对于进一步学习更复杂的网络服务如Web服务器、分布式系统或云计算平台等都是非常有...
斯坦福大学经典教材网上有配套的公开课视频 ...13.4 面向对象设计的原则 13.5 小结 13.6 复习题 13.7 编程练习 第14章 展望 14.1 递归 14.2 并发 14.3 使用网络 14.4 编程模式 14.5 小结 14.6 复习题 14.7 编程练习
Java内存分配和管理是Java编程中的关键概念,它关乎程序的性能和稳定性。...以上就是Java内存分配和管理的基本概述,了解这些知识点有助于优化代码性能,避免内存泄漏,以及更好地理解和解决程序中的并发问题。