Double LinkedList Deep Copy in Kotlin with Generics and Thread Safety
I'm not going to touch on your question on thread safety as it is a broad topic I am not familiar with. However, I can help with your questions about generics.
Right now, you're using generics great, except in one single place
node.data = 0 as T

The type of node.data is T. This code will fail if T is not Int - for example, if T is String, the code will look like this:
node.data = 0 as String

and that will throw a runtime exception.
Here's the important thing, though. There's no reason to do node.data = &lt;anything&gt;.
I assume the reason for having it originally was to &quot;zero out&quot; or get rid of the data as it's removed from the list - but that's what java will do for you automatically!
Let's say you have the following structure
linked list    /--&gt; node 1   /--&gt; value 1
-----------    |    ------   |    --------
first node ---/     data ---/        7

when you delete the pointer to node 1, you end up in this situation
linked list         node 1   /--&gt; value 1
-----------         ------   |    --------
first node-&gt;null    data ---/        7

now that there is no reference anywhere to node 1, the jvm garbage collector deletes it
linked list         value 1
-----------         ------
first node-&gt;null        7

and because there is no reference to value 1, it's also deallocated.
This means that there's no reason to set the data field to anything - and, besides the point, there is no possible value you could set it to that would work for any value of T (in java, though, you could use null)