Thursday, 24 February 2011

Clone, Cloneable, Deep and Shallow Clone


CLONE and CLONEABLE:
Clone is a protected method defined in Object class. To clone any class that class should must implement Cloneable interface which is a marker interface otherwise it will through CloneNotSupportedException. 
Cloneable is a marker interface so no method defined. Interesting thing is it does not support Generics probably because it was there before Generics or for backward compatibility.
Cloneable Vs Serialization:
Cloneable interface is used to make a clone of a object,every time create a new instance by new operator is costly in terms of JVM ,resource & performance. so we can create similar type of instance with the help of already been created instance by using clone()


Serialization is a process to convert your object into bitstream and send accross the network and deserialze at other end,process like Marshling. By default serialization dies Deep Copy.



SHALLOW COPY vs DEEP COPY:
Shallow copies duplicate as little as possible. A shallow copy of a collection is a copy of the collection structure, not the elements. With a shallow copy, two collections now share the individual elements.
Deep copies duplicate everything. A deep copy of a collection is two collections with all of the elements in the original collection duplicated.

How to do SHALLOW COPY:
For shallow copy we can clone() method but make sure all field reference classes should also be Cloneable.

How to do DEEP COPY:

Solution 1: Use Copy Constructor

class DeepCloneableClass {
   //Define other constructor as usual

   //Copy Constructor for deep cloning
   public DeepCloneableClass(DeepCloneableClass from){
      this.field1  = from.getField1();
      ...
      ...
   }
}


Solution 2: Use Factory Pattern 

class DeepCloneableClass {

//Create factory method for deep cloning
    public static DeepCloneableClass fromInstance(DeepCloneableClass from){
        new DeepCloneableClass(from.getFeild1());
        ...
    }
}

Solution 3: Force by new Interface like DeepCloneable


interface DeepCloneable<T>{            
    //In implementaion create deep copy
    public T deepClone(T t);
}



Example Showing Difference Between Deep and Shallow Copy:
************************************************

package com.object;


class Person implements Cloneable {
// Lower-level object
private Car car;


private String name;


public Car getCar() {
return car;
}


public String getName() {
return name;
}


public void setName(String s) {
name = s;
}


public Person(String s, String t) {
name = s;
car = new Car(t);
}


public Object deepClone() {
// Deep copy
Person p = new Person(name, car.getName());
return p;
}


public Object shallowClone() {
// shallow copy
try {
return super.clone();
} catch (CloneNotSupportedException e) {
return null;
}
}
}


class Car {


private String name;


public String getName() {
return name;
}


public void setName(String s) {
name = s;
}


public Car(String s) {
name = s;
}
}


public class DeepNShallowCopyTest {


public static void main(String[] args) {
// Original Object
Person p = new Person("Person-A", "Civic");
System.out.println("Original (orginal values): " + p.getName() + " - "
+ p.getCar().getName());


// Clone as a shallow copy
Person q = (Person) p.shallowClone();


System.out.println("Clone (before change): " + q.getName() + " - "
+ q.getCar().getName());


// change the primitive member
q.setName("Person-B");


// change the lower-level object
q.getCar().setName("Accord");


System.out.println("Clone (after change): " + q.getName() + " - "
+ q.getCar().getName());


System.out.println("Original (after clone is modified): " + p.getName()
+ " - " + p.getCar().getName());


System.out.println("********************************");


// Original Object
Person dp = new Person("Person-A", "Civic");
System.out.println("Original (orginal values): " + dp.getName() + " - "
+ dp.getCar().getName());


// Clone as a shallow copy
Person dq = (Person) dp.deepClone();


System.out.println("Clone (before change): " + dq.getName() + " - "
+ dq.getCar().getName());


// change the primitive member
dq.setName("Person-B");


// change the lower-level object
dq.getCar().setName("Accord");


System.out.println("Clone (after change): " + dq.getName() + " - "
+ dq.getCar().getName());


System.out.println("Original (after clone is modified): "
+ dp.getName() + " - " + dp.getCar().getName());


}
}

OUTOUT :

Original (orginal values): Person-A - Civic
Clone (before change): Person-A - Civic
Clone (after change): Person-B - Accord
Original (after clone is modified): Person-A - Accord
********************************
Original (orginal values): Person-A - Civic
Clone (before change): Person-A - Civic
Clone (after change): Person-B - Accord
Original (after clone is modified): Person-A - Civic

Thread Concepts

Difference between "green" threads and "native" threads?


Both green and native threads are mechanisms to support multithreaded execution of Java programs. Some JDK distributions (such as Blackdown's) include the option to run with either type of threading.
Native threads use the operating system's native ability to manage multi-threaded processes - in particular, they use the pthread library. When you run with native threads, the kernel schedules and manages the various threads that make up the process.
Green threads emulate multithreaded environments without relying on any native OS capabilities. They run code in user space that manages and schedules threads; Sun wrote green threads to enable Java to work in environments that do not have native thread support.
There are some important differences between using the two in a Linux environment:
  • Native threads can switch between threads pre-emptively, switching control from a running thread to a non-running thread at any time. Green threads only switch when control is explicitly given up by a thread (Thread.yield(), Object.wait(), etc.) or a thread performs a blocking operation (read(), etc.).
  • On multi-CPU machines, native threads can run more than one thread simultaneously by assigning different threads to different CPUs. Green threads run on only one CPU.
  • Native threads create the appearance that many Java processes are running: each thread takes up its own entry in the process table. One clue that these are all threads of the same process is that the memory size is identical for all the threads - they are all using the same memory.
    Unfortunately, this behavior limits the scalability of Java on Linux. The process table is not infinitely large, and processes can only create a limited number of threads before running out of system resources or hitting configured limits.

Atomic, Volatile, Transient

java.util.concurrent.atomic Description


A small toolkit of classes that support lock-free thread-safe programming on single variables. In essence, the classes in this package extend the notion ofvolatile values, fields, and array elements to those that also provide an atomic conditional update operation of the form:
  boolean compareAndSet(expectedValue, updateValue);
This method (which varies in argument types across different classes) atomically sets a variable to the updateValue if it currently holds theexpectedValue, reporting true on success. The classes in this package also contain methods to get and unconditionally set values, as well as a weaker conditional atomic update operation weakCompareAndSet. The weak version may be more efficient in the normal case, but differs in that any given invocation of weakCompareAndSet method may fail, even spuriously (that is, for no apparent reason). A false return means only that the operation may be retried if desired, relying on the guarantee that repeated invocation when the variable holds expectedValue and no other thread is also attempting to set the variable will eventually succeed. All primitive types are having atomic wrapper classes.
AtomicInteger
AtomicFloat
Atomic Double

VOLATILE:
-----------

Declaring a volatile Java variable means:
  • The value of this variable will never be cached thread-locally: all reads and writes will go straight to "main memory";
  • Access to the variable acts as though it is enclosed in a synchronizedblock, synchronized on itself.
It can be used as a counter at class level or for implementing lock object etc.

TRANSIENT:
------------
The modifier transient can be applied to field members of a class to turn off serialization on these field members. Every field marked as transient will not be serialized. You use thetransient keyword to indicate to the Java virtual machine that the transient variable is not part of the persistent state of an object.
The transient modifier applies to variables only.
Like other variable modifiers in the Java system, you use transient in a class or instance variable declaration like this:
class TransientExample {
    transient int hobo;
    . . .
}



Q. Can transient variable may be static or final?
Surprisingly, the java compiler does not complaint if you declare a static member field astransient. However, there is no point in declaring a static member field as transient, sincetransient means: "do not serialize", and static fields would not be serialized anyway.
On the other hand, an instance member field declared as final could also be transient, but if so, you would face a problem a little bit difficult to solve: As the field is transient, its state would not be serialized, it implies that, when you deserialize the object you would have to initialize the field manually, however, as it is declared final, the compiler would complaint about it.

Saturday, 5 February 2011

ADVANCE THREAD

Java.util.concurrent package
Quick view on the important interfaces and classes bundled in this package.
Important Interfaces:
  1. ThreadFactory
  2. Executor
  3. ExecutorService
  4. ScheduledExecutorService
  5. Future<E>
  6. Callable<E>
  7. ScheduledFuture<E>
  8. BlockingQueue<V>
  9. ConcurrentMap<V>

Important Classes:
  1. Blocking queue implementation-
  2. ArrayBlockingQueue<v>
  3. LinkedBlockingQueue<V>
  4. PriorityBlockingQueue<v>
  5. SynchronousQueue<v>  
For high degree of concurrency-
  1. ConcurrentHashMap<k,v>
  2. ConcurrentLinkedQueue<v>
For iterator use to avoid ConcurrentModificationException exception-
  1. CopyOnWriteArrayList<>
  2. CopyOnWriteArraySet<>


Conditional Thread-Safety (Synchronized wrapper):
Java 1.2 adressed thread safety by introducing synchronized-collections wrappers, synchronizedMap and synchronizedList, are sometimes called Conditionally thread safe - all individual operations are thread-safe, but sequences of operations where the control flow depends on the results of previous operations may be subject to data races.
The conditional thread safety provided by synchronizedList and synchronizedMap present a hidden hazard -- developers assume that because these collections are synchronized, they are fully thread-safe, and they neglect to synchronize compound operations properly. The result is that while these programs appear to work under light load, under heavy load they may start throwing NullPointerException or ConcurrentModificationException.

Thread-Safety By immutability (CopyOnWriteArrayList and CopyOnWriteArraySet):
If you are using an ordinary ArrayList to store a list of listeners, as long as the list remains mutable and may be accessed by multiple threads, you must either lock the entire list during iteration or clone it before iteration, both of which have a significant cost. CopyOnWriteArrayList instead creates a fresh copy of the list whenever a mutative operation is performed, and its iterators are guaranteed to return the state of the list at the time the iterator was constructed and not throw a ConcurrentModificationException.
The CopyOnWriteArrayList class is intended as a replacement for the ArrayList in concurrent applications where traversals greatly outnumber insertions or removals. It helps to get all the thread-safety benefits of immutability without the need for locking.
ConcurrentHashMap:
ConcurrentHashMap is designed to optimize retrieval operations; in fact, successful get() operations usually succeed with no locking at all. Achieving thread-safety without locking is tricky and requires a deep understanding of the details of the Java Memory Model.
“ConcurrentHashMap achieves higher concurrency by slightly relaxing the promises it makes to callers. A retrieval operation will return the value inserted by the most recent completed insert operation, and may also return a value added by an insertion operation that is concurrently in progress (but in no case will it return a nonsense result). Iterators returned byConcurrentHashMap.iterator() will return each element once at most and will not ever throwConcurrentModificationException, but may or may not reflect insertions or removals that occurred since the iterator was constructed. No table-wide locking is needed (or even possible) to provide thread-safety when iterating the collection.ConcurrentHashMap may be used as a replacement for synchronizedMap or Hashtable in any application that does not rely on the ability to lock the entire table to prevent updates.”
Imp Note:
1.    Unlike HashMap and like HashTable, CocurrentHashMap does not allow null key, as it has been derived with intension to make compatible to HashMap and HashTable both.
2.    The related ConcurrentReaderHashMap class offers similar multiple-reader concurrency, but allows only a single active writer.
3.    This class supports a hard-wired preset concurrency level of 32. This allows a maximum of 32 put and/or remove operations to proceed concurrently. This level is an upper bound on concurrency
**Interesting : Why ConcurrentHashmap but no ConcurrentHashSet**
There is NOT any support for locking the entire table to prevent updates. This makes it impossible, for example, to add an element only if it is not already present, since another thread may be in the process of doing the same thing. If you need such capabilities, consider instead using the ConcurrentReaderHashMap class.
Blocking Queues and implementations:
A blocking queue is a queue that blocks when you try to dequeue from it and the queue is empty, or if you try to enqueue items to it and the queue is already full. A thread trying to dequeue from an empty queue is blocked until some other thread inserts an item into the queue. A thread trying to enqueue an item in a full queue is blocked until some other thread makes space in the queue, either by dequeuing one or more items or clearing the queue completely.  All BlockingQueue implementations are threadsafe.
  • A ConcurrentLinkedQueue is an appropriate choice when many threads will share access to a common collection. This queue does not permit null elements. This queue orders elements FIFO (first-in-first-out)
  • ArrayBlockingQueue is a classic "bounded buffer", in which a fixed-sized array holds elements inserted by producers and extracted by consumers. This class supports an optional fairness policy for ordering waiting producer and consumer threads. This queue orders elements FIFO (first-in-first-out). 
  • LinkedBlockingQueue typically have higher throughput than array-based queues but less predictable performance in most concurrent applications.
  • PriorityBlockingQueue relying on natural ordering also does not permit insertion of non-comparable objects (doing so results in ClassCastException).
  • A synchronous queue does not have any internal capacity, not even a capacity of one. You cannot peek at a synchronous queue because an element is only present when you try to take it; you cannot add an element (using any method) unless another thread is trying to remove it; you cannot iterate as there is nothing to iterate

Difference between blocking queue implementations like:
ArrayBlockingQueue, LinkedBlockingQueue and ConcurrentLinkedQueue-

Basically the differences between them are performance characteristics and blocking behavior.
Taking the easiest first, ArrayBlockingQueue is a queue of a fixed size. So if you set the size at 10, and attempt to insert an 11th element, the insert statement will block until another thread removes an element. The fairness issue is what happens if multiple threads try to insert and remove at the same time (in other words during the period when the Queue was blocked). A fairness algorithm ensures that the first thread that asks is the first thread that gets. Otherwise, a given thread may wait longer than other threads, causing unpredictable behavior (sometimes one thread will just take several seconds because other threads that started later got processed first). The trade-off is that it takes overhead to manage the fairness, slowing down the throughput.

The most important difference between LinkedBlockingQueue and ConcurrentLinkedQueue is that if you request an element from a LinkedBlockingQueue and the queue is empty, your thread will wait until there is something there. A ConcurrentLinkedQueue will return right away with the behaviour of an empty queue.

Which one depends on if you need the blocking, Where you have many producers and one consumer, it sounds like it. On the other hand, where you have many consumers and only one producer, you may not need the blocking behaviour, and may be happy to just have the consumers check if the queue is empty and move on if it is.

Annexure Links:
http://www.ibm.com/developerworks/java/library/j-jtp07233.html

How Vector / HashTable are thread Safe?


java.util.Hashtable and java.util.Vector are two examples of JDK objects whose every method is synchronized. This imposes a large runtime cost on applications that iterate over these structures. When you are not using threads, prefer java.util.HashMap and java.util.ArrayList. Thread.sleep(5000) is supposed to sleep for 5 seconds. However, if somebody changes the system time, you may sleep for a very long time or no time at all. The OS records the wake up time in absolute form, not relative.