java并发编程笔记(一)

一、介绍

由初始的计算机由始至终的执行一个程序到后面的,操作系统同时运行多个进程。

促进多程序同时执行的发展的因素:

1.资源利用:比如在执行某些输入输出时,程序需要等待,但是在等待的过程运行其他进程,将加大对系统资源的利用

2.公平:多个程序拥有相同的优先级,将同时执行,这比执行完一个程序在继续下一个程序更可取

3.方便:写一些程序,让他们各自执行并进行相互之间的协调,这比让一个程序执行所以的任务更方便

 

二、线程的优点

主要优点:提高复杂应用程序的性能

1:多处理器:多处理器配合多线程,充分的利用系统资源,提高程序的吞吐量

2:模型的简化:比如servlet或远程方法调用,这些框架内部往往需要处理,请求管理,线程创建,负载均衡等。但是Servlet的开发者不需要关心这些,也不需要关心同时有多少个线程在执行,往往像开发一个单线程程序开发这些代码。

3:异步事件的处理:一个服务端,同时连接多个客户端,为每一个客户端连接创建一个线程,这样可以进行同步IO

 

三、线程的风险

线程虽然带来了好处,但是同时也带来了风险

1.安全危险:

public class UnsafeSequence {
	
	private int value;
	
	public int getNext(){
		return value++;
	}
}

getNext();这个方法不是线程安全的,将引发线程安全问题,因为不能在多线程情况下保证代码有顺序的执行,因为i++这个步骤在jvm中执行的是3条指令。

2.活跃度的危险:一种活跃度失败发生在顺序程序中,比如死循环之后的代码永远不会被执行。活跃度失败的各种形式还有比如:死锁,线程A等待线程B占有的资源,线程B永远不会释放资源;饥饿;活锁等。活跃度失败bug很难察觉,因为它们取决于线程间事件的相关时序。

3.性能危险:光有好的活跃度还不行,往往我们还需要程序的快速执行。性能涉及多方面,如:服务时间,响应性,吞吐量,资源消费,可伸缩性等。多线程往往会带来运行时一定程度的开销,上下文的切换会带来一定的消耗。

 

四、什么是线程安全

官方:可以被多个线程调用,这些线程之前没有非预期的交互

   可以同时被多个线程调用,调用者之前不需要额外操作来保证线程安全   

 

五、可重入锁(ReeTrancy)

public class Test4 {

	public synchronized void doSomething(){
		System.out.println("aa");
	}
	
}

class LoggingTest extends Test4{
	
	public synchronized void doSomething(){
		System.out.println("aa");
		super.doSomething();
	}
}

这一段代码,如果不是可重入,将会进入死锁,线程去请求一个已经被字节占用锁的资源。

但是synchronized是重入锁,即每个锁关联一个计数器和一个占有它的线程。当计数器为0,锁为未被占有,线程请求一个未被占有的锁,jvm记录锁的占有者,计数器加1.如果同一个线程再次请求该锁,计数器再加一,线程退出一次同步快,计数器减一,直到减少为0.

 

六、活跃度与性能

尽可能将无状态,可同时被多线程访问的代码从synchronized代码块中提取出来,以此来提高性能。

你可能感兴趣的:(并发,java,多线程,java并发编程)