c# - Is that synchro-construction correct? -
i have multi-threaded application. threads use abc.connector. want 1 thread @ time have access connector property.
class abc { /// <summary> /// synchronization object. /// </summary> static object _syncobject = new object(); static dataaccess _connector; /// <summary> /// global object data access. /// </summary> public static dataaccess connector { { lock (_syncobject) { return _connector.createcopy(); // copy of original _connector } } set { lock (_syncobject) { _connector = value; } } } }
is correct ?
well, make getting , setting connector
property thread-safe (although i'd make _syncobject
read-only). however, doesn't make dataaccess
thread-safe... mutex apply while threads getting , setting property.
in other words, if 2 threads both do:
abc.dataaccess.dosomelongrunningoperation();
then dosomelongrunningoperation()
still run concurrently 2 threads. if operation isn't thread-safe, it's still going problem.
if want 1 thread @ time use dataaccess
write:
public static void useconnector(action<dataaccess> action) { lock (_syncobject) { action(_connector); } }
then if 2 threads both do:
abc.useconnector(access => access.dolongrunningoperation());
then dolongrunningoperation()
run in 1 thread @ time. you've still got issue misbehaving clients write:
dataaccess naughty = null; abc.useconnector(access => naughty = access); // haha! i've circumvented thread safety! naughty.dolongrunningoperation();
... isn't issue you.
Comments
Post a Comment