16.6 You are given a class with synchronized method A and a normal method B. If you have two threads in one instance of a program, can they both execute A at the same time? Can they execute A and B at the same time? 当我们给一个方法加了synchronized关键字,我们确保了两个线…
摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方法,也可以选择同步块,这两种方式各有优缺点,至于具体选择什么方式,就见仁见智了,同步块不仅可以更加精确的控制对象锁,也就是控制锁的作用域,何谓锁的作用域?锁的作用域就是从锁被获取到其被释放的时间.而且可以选择要获取哪个对象的对象锁.但是如果在使用同步块机制时,如果使用过多的锁也会容易引起死锁问题,同…
1. 必须基于对象 Synchronized Method 和 Synchronized(this) 块,除了范围小点 (方法和块),没差别都是阻塞整个对象 - 如果对象有多个 Synchronized 只能一个执行. 2. Synchronized(object) 最好 - 基于块,只是需要基于全局对象,或者多线程要访问的对象 3. Synchronized (*.class) 类的所有对象实例起作用.…
16.5 Suppose we have the following code:public class Foo { public Foo() { . . . } public void first() { ... } public void second() { ... } public void thirdQ { ... }}The same instance of Foo will be passed to three different threads. ThreadA will cal…
本文介绍java最基本的同步方式,即使用synchronized关键字来控制一个方法的并发访问,如果一个对象已用synchronized关键字声明,那么只有一个执行线程允许去访问它,其它试图访问这个对象的线程将被挂起,直到第一个线程访问完毕. 下面通过一个小例子来学习这个概念,公司向银行存钱,取钱场景. 1:创建Account的账号类,它是银行账户的模型,只有一个双精度浮点型属性,balance. 2:实现balance的get set 方法. 3:实现AddAmount()方法,将传入的数量加…
16.4 Design a class which provides a lock only if there are no possible deadlocks. 有很多方法可以避免死锁的发生,一个常用的方法是列出所需要的锁,然后判断锁上这些锁后会不会发生死锁,比如有如下的锁的顺序: A = {1, 2, 3, 4} B = {1, 3, 5} C = {7, 5, 9, 2} 这是有可能产生死锁的,比如当A锁上2等待3,当B锁上3等待5,当C锁上5等待2,我们可以将其看做图,2连上3,3连上…
16.3 In the famous dining philosophers problem, a bunch of philosophers are sitting around a circular table with one chopstick between each of them. A philosopher needs both chopsticks to eat, and always picks up the left chopstick before the right o…
16.2 How would you measure the time spent in a context switch? 上下文转换发生在两个进程之间,比如让一个等待进程进入执行和让一个运行进程进入等待,这些在多任务中发生.操作系统需要把等待进程的信息放入内存和把当前运行的进程信息保存下来.为了解决这个问题,我们记录在切换进程时的最后和第一个指令的时间点,比如我们有两个进程P1和P2,P1在执行P2在等待,当我们切换P1和P2时,假设发生在P1的第N个指令,我们用tx,k来表示进程x的第k个…
16.1 What's the difference between a thread and a process? 进程Process是程序执行时的一个实例.一个进程是被分配系统资源的独立单元,每个进程在独立的地址空间上执行,如果需要使用其他进程的资源,需要使用进程间通讯,包括管道Pipes,文件Files,套接字Sockets,或者其他形式. 线程Thread存在于进程之中并分享进程的资源(包括堆空间).同一个进程中的多个线程分享同一个堆地址.这是和进程区别很大的地方,进程之间不能直接访问内…
synchronized关键字有两种用法.第一种就是在<使用Synchronized关键字同步类方法>一文中所介绍的直接用在方法的定义中.另外一种就是synchronized块.我们不仅可以通过synchronized块来同步一个对象变量, 也可以使用synchronized块来同步类中的静态方法和非静态方法. synchronized块的语法如下: public void method() { … … synchronized(表达式) { … … } } 一.非静态类方法的同步    从&…