M362 - Unit 4 Flashcards

1
Q

Summarise the advantages and disadvantages of using virtual machines.

A

Disadvantages: slower execution speed of the program (compared with compiling it directly to machine code that is interpreted by the CPU), subject to backward compatibility problems and to the limitations of the various platforms.
Advantages: generated VM code is smaller than the corresponding machine code, can be executed on various platforms without requiring any changes, facilitate the development of applications written in multiple languages and promote the creation of new languages.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Why is the new semantics of volatile variables an extension of the old one?

A

Because a memory barrier on each volatile variable access still forces the variable to be read from or written to shared memory, as required by the old memory model.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Indicate one of the central concerns for correctness of multithreaded applications.

A

For a multithreaded application to behave correctly, changes made to shared variables by one thread must be visible to all other threads reading those variables.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Indicate two problems that affect the achievement of correctness.

A

Updates in one thread might not be visible to other threads due to code reordering or because the values’ copies held in local and shared memories are inconsistent.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Indicate the generic techniques that address the problems of code reordering and inconsistency.

A

Mutual exclusion serialises accesses and this prevents the side effects of code reordering. To address the inconsistency problem, a memory model defines how value updates are propagated via memory barriers.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Name the concrete Java mechanisms that implement the techniques of code reordering and inconsistency.

A

Mutual exclusion is imposed by synchronised code. Memory barriers that make the values held locally by the thread consistent with those held in shared memory are created by accessing volatile variables or by synchronising code.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

How can the mechanisms that implement the techniques of code reordering and inconsistency be used.

A

Correct behaviour can be guaranteed only if threads synchronise on the same monitor or access the same volatile variable. Code is not reordered across memory barriers, which makes it possible to use volatile variables to flag changes to shared variables.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Through which method calls can a Java thread release control?

A

By calling sleep, yield, wait or join

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

<p>

| Name the two ways of implementing Java threads (in the JVM specifically)</p>

A

<p>
Among the decisions left open by the JVM specification is how to implement Java threads: they may be green threads, i.e. managed by the JVM, or native threads, i.e. managed by the operating system.</p>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Name the advantages and disadvantages of the two ways of implementing Java threads.

A

Using green threads may be the best option if the underlying platform does not have threads, but the disadvantage is that the JVM implementation becomes more complex. Using native threads has the advantage of exploiting better the underlying platform resources, in particular if it has multiple processors. On the other hand, native threads make the behaviour of the Java program dependent on the way the operating system schedules and prioritises threads.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Name the consequences for writing platform-independent programs.

A

This means that for a program to be truly platform independent it should:

  • not use thread priorities;
  • release control–via wait and sleep rather than yield – whenever adequate, to avoid problems if executed on a cooperative multitasking platform;
  • access shared data only under mutual exclusion, so as to avoid problems if executed on a pre-emptive multitasking platform.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Can you recall, from earlier in the course, a context where priority queues might be useful?

A

Priority queues are useful when implementing process schedulers (Unit 2, Section 5). Each element in the queue consists of a pair of numbers – the unique process ID and the process priority. The next process to be scheduled is the one at the front of the priority queue.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

What is a re-entrant lock?

A

A re-entrant lock can be reacquired by a thread that already holds it

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

List some shortcomings of Java’s built-in monitors and how they are addressed by the interfaces and classes of the java.util.concurrent.locks package.

A

Some disadvantages of the built-in monitors are:

  • no separation of data, lock, and condition variables;
  • one single condition variable per lock;
  • an attempt to acquire a lock cannot be cancelled.

The Lock and Condition interfaces allow the creation of explicit locks that are separate objects, and the creation of multiple conditions per lock. Moreover, the Lock interface allows a thread to timeout on acquiring a lock or to avoid blocking if the lock is not available.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Why should the call to wait not be within a simple if?

A

When a thread T resumes execution after a call to o.wait(), this only means two things: T was notified by some other thread, and T has reacquired the lock on object o. In particular, resumption of execution does not mean that the condition has become true. For example, T might have been woken together with other threads by a notifyAll, and one of those threads may have acquired the lock on o first and invalidated the condition again.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

What is the simplest way of accessing an ArrayList object via synchronised methods

A

The simplest way is to wrap it using Collections.synchronizedList

17
Q

What are the thread-safety levels of LinkedList and CopyOnWriteArrayList

A

LinkedList is thread-compatible, like ArrayList, while CopyOnWriteArrayList is conditionally thread-safe. The latter is not thread-safe because different threads may see the data structure in different states due to the weakly consistent iterators.

18
Q

What is scalability under contention, and how do atomic variables help to achieve it?

A

Scalability under contention is the capacity to maintain a high throughput when multiple threads are trying to use the same resource. Using an atomic variable means there are no locks and therefore threads don’t get blocked, and the JVM spends less time scheduling threads. Atomic variables can therefore make the code simpler and also make it run faster.

19
Q

Name the 5 components of the Java Virtual Machine.

A
Bytecode verifier (checks whether the bytecode about to be executed has not been tampered with). 
Class loader (loads classes at runtime into the JVM's memory). 
Bytecode interpreter (executes the bytecode). 
Garbage collector (reclaims the memory occupied by unused objects from the heap). 
JIT compiler (translates VM code into machine code the first time the program is executed).