Generic thread-safe data structure
Using Interlocked on a class reference grants atomic transaction when you exchange an object for another;

For example, using 

Interlocked.Exchange&lt;T&gt;(ref _data, value);


will exchange an object for an other, returning the previous object. 

ReaderWriterLockSlim will protect some parts of your code, and you could also protect the object get/set with it.

Use only one of the lock, not both !

Also, you don't need usually to protect the initial set statement in your Ctor. Basically, you can only create a new object once in only one thread, before  sharing anything related to this object.

One last point, with this code you are protecting the object reference, not the object itself. See below ...

class MyString {
    public string Data {get; set;}
}
...
var myString = new MyString() ;
var mySharedString = new SharedData&lt;MyString&gt;(myString) ;
...    
... thread 1
... mySharedString.Value.Data = "Hello" ;
...
... thread 2
... mySharedString.Value.Data = "BAD" ;


If the shared object is ReadOnly, it works, if the object is mutable, it will fail badly.