By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
425,677 Members | 1,890 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 425,677 IT Pros & Developers. It's quick & easy.

What exactly does it mean when they say

P: n/a
cj
members of this type are safe for multithreaded operations. Instance
members are not guaranteed to be thread-safe.
I'm under the impression before you can use a class you have to make an
instance of it. So how can a class be threadsafe by itself but an
instance of it not be?

I guess I don't get what exactly being threadsafe means. Multiple
theads can use the same instance of a class?
Jul 5 '06 #1
Share this Question
Share on Google+
18 Replies


P: n/a
Those classes may have shared methods. In which case, those methods are
thread safe. So if multiple threads are calling the same shared method,
that is safe and no extra precautions need to be taken by the developer.

If 2 threads are pointing to the same instance of the class, then those
instance methods are not guaranteed to be thread safe, and it is up to the
developer to synchronize access.

"cj" <cj@nospam.nospamwrote in message
news:uN**************@TK2MSFTNGP02.phx.gbl...
members of this type are safe for multithreaded operations. Instance
members are not guaranteed to be thread-safe.
I'm under the impression before you can use a class you have to make an
instance of it. So how can a class be threadsafe by itself but an
instance of it not be?

I guess I don't get what exactly being threadsafe means. Multiple theads
can use the same instance of a class?

Jul 5 '06 #2

P: n/a
cj
Sorry but to me these two situations sound the same. I don't understand
what the difference is. To use a class I have to create an instance of
it, right? Then I have multiple threads that will want to call methods
in that instance of the class. Not thread safe? Or thread safe?

Marina Levit [MVP] wrote:
Those classes may have shared methods. In which case, those methods are
thread safe. So if multiple threads are calling the same shared method,
that is safe and no extra precautions need to be taken by the developer.

If 2 threads are pointing to the same instance of the class, then those
instance methods are not guaranteed to be thread safe, and it is up to the
developer to synchronize access.

"cj" <cj@nospam.nospamwrote in message
news:uN**************@TK2MSFTNGP02.phx.gbl...
>members of this type are safe for multithreaded operations. Instance
members are not guaranteed to be thread-safe.
I'm under the impression before you can use a class you have to make an
instance of it. So how can a class be threadsafe by itself but an
instance of it not be?

I guess I don't get what exactly being threadsafe means. Multiple theads
can use the same instance of a class?

Jul 5 '06 #3

P: n/a
Hello cj,
Sorry but to me these two situations sound the same. I don't
understand what the difference is. To use a class I have to create an
instance of it, right? Then I have multiple threads that will want to
call methods in that instance of the class. Not thread safe? Or
thread safe?
That case is not thread safe. The case that is thread safe are when you
call the "shared" methods. These are not associated with an instance and
the documentation indicates they are safe for multi-threaded access.

--
Jared Parsons [MSFT]
ja******@online.microsoft.com
All opinions are my own. All content is provided "AS IS" with no warranties,
and confers no rights.
Jul 5 '06 #4

P: n/a

cj wrote:
Sorry but to me these two situations sound the same. I don't understand
what the difference is. To use a class I have to create an instance of
it, right?
No.

There are two types of methods on classes. Instance methods and Shared
methods.

An instance method is declared:
Public Sub Foo()
....
End Sub

A shared method is declared:
Public Shared Sub Bar()
....
End Sub

If the class is called Foobar, then to call Foo:

dim o as new Foobar
o.Foo()

Notice I had to create an instance first. But to call Bar:

Foobar.Bar()

I don't have to create an instance because it is _shared_. I simply
use the name of the class. In C++-speak, it's a static method. In OOP
speak, a _class_ method.

Example in the framework:
Int32.Parse("42")

Jul 5 '06 #5

P: n/a
No, you do not always need an instance of a class to use it.

I think you need to read up on what shared methods are.

"cj" <cj@nospam.nospamwrote in message
news:eP****************@TK2MSFTNGP04.phx.gbl...
Sorry but to me these two situations sound the same. I don't understand
what the difference is. To use a class I have to create an instance of
it, right? Then I have multiple threads that will want to call methods in
that instance of the class. Not thread safe? Or thread safe?

Marina Levit [MVP] wrote:
>Those classes may have shared methods. In which case, those methods are
thread safe. So if multiple threads are calling the same shared method,
that is safe and no extra precautions need to be taken by the developer.

If 2 threads are pointing to the same instance of the class, then those
instance methods are not guaranteed to be thread safe, and it is up to
the developer to synchronize access.

"cj" <cj@nospam.nospamwrote in message
news:uN**************@TK2MSFTNGP02.phx.gbl...
>>members of this type are safe for multithreaded operations. Instance
members are not guaranteed to be thread-safe.
I'm under the impression before you can use a class you have to make an
instance of it. So how can a class be threadsafe by itself but an
instance of it not be?

I guess I don't get what exactly being threadsafe means. Multiple
theads can use the same instance of a class?
Jul 5 '06 #6

P: n/a
cj
Ok.

But the act of declaring Public Shared alone doesn't make it threadsafe
does it? I have this class MyThreadCount (see below) which creates
public shared classes but I was told I had to use the synclock to keep
multiple threads from manipulating the count at the same time. Is this
true?

Public Class MyThreadCount

Private Shared m_lock As New Object
Private Shared m_threadcount As Int32 = 0

Public Shared Sub Increment()
SyncLock (m_lock)
m_threadcount += 1
End SyncLock
End Sub

Public Shared Sub Decrement()
SyncLock (m_lock)
m_threadcount -= 1
End SyncLock
End Sub

Public Shared ReadOnly Property ThreadCount() As Int32
Get
Dim _count As Int32
SyncLock (m_lock)
_count = m_threadcount
End SyncLock
Return _count
End Get
End Property
End Class
Travers Naran wrote:
cj wrote:
>Sorry but to me these two situations sound the same. I don't understand
what the difference is. To use a class I have to create an instance of
it, right?

No.

There are two types of methods on classes. Instance methods and Shared
methods.

An instance method is declared:
Public Sub Foo()
...
End Sub

A shared method is declared:
Public Shared Sub Bar()
...
End Sub

If the class is called Foobar, then to call Foo:

dim o as new Foobar
o.Foo()

Notice I had to create an instance first. But to call Bar:

Foobar.Bar()

I don't have to create an instance because it is _shared_. I simply
use the name of the class. In C++-speak, it's a static method. In OOP
speak, a _class_ method.

Example in the framework:
Int32.Parse("42")
Jul 5 '06 #7

P: n/a
No, having a method declared as Shared does not automatically make it thread
safe.

But if there is a note in the documentation that says it is thread safe,
then developers of that method took precautions to make sure it is.

"cj" <cj@nospam.nospamwrote in message
news:un**************@TK2MSFTNGP02.phx.gbl...
Ok.

But the act of declaring Public Shared alone doesn't make it threadsafe
does it? I have this class MyThreadCount (see below) which creates public
shared classes but I was told I had to use the synclock to keep multiple
threads from manipulating the count at the same time. Is this true?

Public Class MyThreadCount

Private Shared m_lock As New Object
Private Shared m_threadcount As Int32 = 0

Public Shared Sub Increment()
SyncLock (m_lock)
m_threadcount += 1
End SyncLock
End Sub

Public Shared Sub Decrement()
SyncLock (m_lock)
m_threadcount -= 1
End SyncLock
End Sub

Public Shared ReadOnly Property ThreadCount() As Int32
Get
Dim _count As Int32
SyncLock (m_lock)
_count = m_threadcount
End SyncLock
Return _count
End Get
End Property
End Class
Travers Naran wrote:
>cj wrote:
>>Sorry but to me these two situations sound the same. I don't understand
what the difference is. To use a class I have to create an instance of
it, right?

No.

There are two types of methods on classes. Instance methods and Shared
methods.

An instance method is declared:
Public Sub Foo()
...
End Sub

A shared method is declared:
Public Shared Sub Bar()
...
End Sub

If the class is called Foobar, then to call Foo:

dim o as new Foobar
o.Foo()

Notice I had to create an instance first. But to call Bar:

Foobar.Bar()

I don't have to create an instance because it is _shared_. I simply
use the name of the class. In C++-speak, it's a static method. In OOP
speak, a _class_ method.

Example in the framework:
Int32.Parse("42")

Jul 5 '06 #8

P: n/a
cj
Ok, believe it or not were making progress. I think between my
threadcount class and Travers examples I'm getting an idea of how to
write a class that's threadsafe or not.

But for MS classes... Right now I'm looking at the Queue class and it
says, "Public static (Shared in Visual Basic) members of this type are
safe for multithreaded operations." How do I tell which of the methods
listed under Queue Members are public static? They list Public
Constructor, Public Properties, Public Methods, and protected Methods.
I see the thread safe message a lot and I would like to know what
exactly it's saying is and isn't threadsafe about the class or how I use
it. If there is a better MS class example than the Queue class feel
free to point it out.
Marina Levit [MVP] wrote:
No, having a method declared as Shared does not automatically make it thread
safe.

But if there is a note in the documentation that says it is thread safe,
then developers of that method took precautions to make sure it is.

"cj" <cj@nospam.nospamwrote in message
news:un**************@TK2MSFTNGP02.phx.gbl...
>Ok.

But the act of declaring Public Shared alone doesn't make it threadsafe
does it? I have this class MyThreadCount (see below) which creates public
shared classes but I was told I had to use the synclock to keep multiple
threads from manipulating the count at the same time. Is this true?

Public Class MyThreadCount

Private Shared m_lock As New Object
Private Shared m_threadcount As Int32 = 0

Public Shared Sub Increment()
SyncLock (m_lock)
m_threadcount += 1
End SyncLock
End Sub

Public Shared Sub Decrement()
SyncLock (m_lock)
m_threadcount -= 1
End SyncLock
End Sub

Public Shared ReadOnly Property ThreadCount() As Int32
Get
Dim _count As Int32
SyncLock (m_lock)
_count = m_threadcount
End SyncLock
Return _count
End Get
End Property
End Class
Travers Naran wrote:
>>cj wrote:
Sorry but to me these two situations sound the same. I don't understand
what the difference is. To use a class I have to create an instance of
it, right?
No.

There are two types of methods on classes. Instance methods and Shared
methods.

An instance method is declared:
Public Sub Foo()
...
End Sub

A shared method is declared:
Public Shared Sub Bar()
...
End Sub

If the class is called Foobar, then to call Foo:

dim o as new Foobar
o.Foo()

Notice I had to create an instance first. But to call Bar:

Foobar.Bar()

I don't have to create an instance because it is _shared_. I simply
use the name of the class. In C++-speak, it's a static method. In OOP
speak, a _class_ method.

Example in the framework:
Int32.Parse("42")

Jul 5 '06 #9

P: n/a
There is usually an icon in the documentation to indicate that a method is
shared. When you look at the help for that method, it says it is shared
there as well.

A lot of these classes don't actually have any useful shared methods that
you would ever call. You would always end up creating an instance of the
class, at which point those methods on that object are not thread safe.

Some classes might actually have shared methods that you would want to call.
It all depends on the class.

"cj" <cj@nospam.nospamwrote in message
news:%2****************@TK2MSFTNGP03.phx.gbl...
Ok, believe it or not were making progress. I think between my
threadcount class and Travers examples I'm getting an idea of how to write
a class that's threadsafe or not.

But for MS classes... Right now I'm looking at the Queue class and it
says, "Public static (Shared in Visual Basic) members of this type are
safe for multithreaded operations." How do I tell which of the methods
listed under Queue Members are public static? They list Public
Constructor, Public Properties, Public Methods, and protected Methods. I
see the thread safe message a lot and I would like to know what exactly
it's saying is and isn't threadsafe about the class or how I use it. If
there is a better MS class example than the Queue class feel free to point
it out.
Marina Levit [MVP] wrote:
>No, having a method declared as Shared does not automatically make it
thread safe.

But if there is a note in the documentation that says it is thread safe,
then developers of that method took precautions to make sure it is.

"cj" <cj@nospam.nospamwrote in message
news:un**************@TK2MSFTNGP02.phx.gbl...
>>Ok.

But the act of declaring Public Shared alone doesn't make it threadsafe
does it? I have this class MyThreadCount (see below) which creates
public shared classes but I was told I had to use the synclock to keep
multiple threads from manipulating the count at the same time. Is this
true?

Public Class MyThreadCount

Private Shared m_lock As New Object
Private Shared m_threadcount As Int32 = 0

Public Shared Sub Increment()
SyncLock (m_lock)
m_threadcount += 1
End SyncLock
End Sub

Public Shared Sub Decrement()
SyncLock (m_lock)
m_threadcount -= 1
End SyncLock
End Sub

Public Shared ReadOnly Property ThreadCount() As Int32
Get
Dim _count As Int32
SyncLock (m_lock)
_count = m_threadcount
End SyncLock
Return _count
End Get
End Property
End Class
Travers Naran wrote:
cj wrote:
Sorry but to me these two situations sound the same. I don't
understand
what the difference is. To use a class I have to create an instance
of
it, right?
No.

There are two types of methods on classes. Instance methods and Shared
methods.

An instance method is declared:
Public Sub Foo()
...
End Sub

A shared method is declared:
Public Shared Sub Bar()
...
End Sub

If the class is called Foobar, then to call Foo:

dim o as new Foobar
o.Foo()

Notice I had to create an instance first. But to call Bar:

Foobar.Bar()

I don't have to create an instance because it is _shared_. I simply
use the name of the class. In C++-speak, it's a static method. In OOP
speak, a _class_ method.

Example in the framework:
Int32.Parse("42")
Jul 5 '06 #10

P: n/a
cj
Ok, I see now the S icon which says the synchronized method is the only
method in the queue class that is thread safe and that explains that
line about the synchronized wrapper. So two things are running through
my head now. 1. I guess my using synclock is a good way of making my
threadcount class threadsafe so many threads can use it w/o interfering
with each other. Must be as it works. 2. I'm curious about using a
shared method. I keep reading that you have to instigate a class for it
to become an object and use it. Clearly you don't but that confuses me
as to how to view it. Is it an object w/o instigation?

Marina Levit [MVP] wrote:
There is usually an icon in the documentation to indicate that a method is
shared. When you look at the help for that method, it says it is shared
there as well.

A lot of these classes don't actually have any useful shared methods that
you would ever call. You would always end up creating an instance of the
class, at which point those methods on that object are not thread safe.

Some classes might actually have shared methods that you would want to call.
It all depends on the class.

"cj" <cj@nospam.nospamwrote in message
news:%2****************@TK2MSFTNGP03.phx.gbl...
>Ok, believe it or not were making progress. I think between my
threadcount class and Travers examples I'm getting an idea of how to write
a class that's threadsafe or not.

But for MS classes... Right now I'm looking at the Queue class and it
says, "Public static (Shared in Visual Basic) members of this type are
safe for multithreaded operations." How do I tell which of the methods
listed under Queue Members are public static? They list Public
Constructor, Public Properties, Public Methods, and protected Methods. I
see the thread safe message a lot and I would like to know what exactly
it's saying is and isn't threadsafe about the class or how I use it. If
there is a better MS class example than the Queue class feel free to point
it out.
Marina Levit [MVP] wrote:
>>No, having a method declared as Shared does not automatically make it
thread safe.

But if there is a note in the documentation that says it is thread safe,
then developers of that method took precautions to make sure it is.

"cj" <cj@nospam.nospamwrote in message
news:un**************@TK2MSFTNGP02.phx.gbl...
Ok.

But the act of declaring Public Shared alone doesn't make it threadsafe
does it? I have this class MyThreadCount (see below) which creates
public shared classes but I was told I had to use the synclock to keep
multiple threads from manipulating the count at the same time. Is this
true?

Public Class MyThreadCount

Private Shared m_lock As New Object
Private Shared m_threadcount As Int32 = 0

Public Shared Sub Increment()
SyncLock (m_lock)
m_threadcount += 1
End SyncLock
End Sub

Public Shared Sub Decrement()
SyncLock (m_lock)
m_threadcount -= 1
End SyncLock
End Sub

Public Shared ReadOnly Property ThreadCount() As Int32
Get
Dim _count As Int32
SyncLock (m_lock)
_count = m_threadcount
End SyncLock
Return _count
End Get
End Property
End Class
Travers Naran wrote:
cj wrote:
>Sorry but to me these two situations sound the same. I don't
>understand
>what the difference is. To use a class I have to create an instance
>of
>it, right?
No.
>
There are two types of methods on classes. Instance methods and Shared
methods.
>
An instance method is declared:
Public Sub Foo()
...
End Sub
>
A shared method is declared:
Public Shared Sub Bar()
...
End Sub
>
If the class is called Foobar, then to call Foo:
>
dim o as new Foobar
o.Foo()
>
Notice I had to create an instance first. But to call Bar:
>
Foobar.Bar()
>
I don't have to create an instance because it is _shared_. I simply
use the name of the class. In C++-speak, it's a static method. In OOP
speak, a _class_ method.
>
Example in the framework:
Int32.Parse("42")
>
Jul 5 '06 #11

P: n/a
Sorry, I don't know what 'instigation' is. Let's say you have a class named
MyClass with a shared method called MySharedMethod.

In your code, you can just call MyClass.MySharedMethod(). That is all. You
don't need to do anything else.

There is no object created here - there is no instance of MyClass.
MySharedMethod belongs to the type, and not to any particular instance of
that type.

"cj" <cj@nospam.nospamwrote in message
news:up**************@TK2MSFTNGP02.phx.gbl...
Ok, I see now the S icon which says the synchronized method is the only
method in the queue class that is thread safe and that explains that line
about the synchronized wrapper. So two things are running through my head
now. 1. I guess my using synclock is a good way of making my threadcount
class threadsafe so many threads can use it w/o interfering with each
other. Must be as it works. 2. I'm curious about using a shared method.
I keep reading that you have to instigate a class for it to become an
object and use it. Clearly you don't but that confuses me as to how to
view it. Is it an object w/o instigation?

Marina Levit [MVP] wrote:
>There is usually an icon in the documentation to indicate that a method
is shared. When you look at the help for that method, it says it is
shared there as well.

A lot of these classes don't actually have any useful shared methods that
you would ever call. You would always end up creating an instance of the
class, at which point those methods on that object are not thread safe.

Some classes might actually have shared methods that you would want to
call. It all depends on the class.

"cj" <cj@nospam.nospamwrote in message
news:%2****************@TK2MSFTNGP03.phx.gbl...
>>Ok, believe it or not were making progress. I think between my
threadcount class and Travers examples I'm getting an idea of how to
write a class that's threadsafe or not.

But for MS classes... Right now I'm looking at the Queue class and it
says, "Public static (Shared in Visual Basic) members of this type are
safe for multithreaded operations." How do I tell which of the methods
listed under Queue Members are public static? They list Public
Constructor, Public Properties, Public Methods, and protected Methods. I
see the thread safe message a lot and I would like to know what exactly
it's saying is and isn't threadsafe about the class or how I use it. If
there is a better MS class example than the Queue class feel free to
point it out.
Marina Levit [MVP] wrote:
No, having a method declared as Shared does not automatically make it
thread safe.

But if there is a note in the documentation that says it is thread
safe, then developers of that method took precautions to make sure it
is.

"cj" <cj@nospam.nospamwrote in message
news:un**************@TK2MSFTNGP02.phx.gbl...
Ok.
>
But the act of declaring Public Shared alone doesn't make it
threadsafe does it? I have this class MyThreadCount (see below) which
creates public shared classes but I was told I had to use the synclock
to keep multiple threads from manipulating the count at the same time.
Is this true?
>
Public Class MyThreadCount
>
Private Shared m_lock As New Object
Private Shared m_threadcount As Int32 = 0
>
Public Shared Sub Increment()
SyncLock (m_lock)
m_threadcount += 1
End SyncLock
End Sub
>
Public Shared Sub Decrement()
SyncLock (m_lock)
m_threadcount -= 1
End SyncLock
End Sub
>
Public Shared ReadOnly Property ThreadCount() As Int32
Get
Dim _count As Int32
SyncLock (m_lock)
_count = m_threadcount
End SyncLock
Return _count
End Get
End Property
End Class
>
>
Travers Naran wrote:
>cj wrote:
>>Sorry but to me these two situations sound the same. I don't
>>understand
>>what the difference is. To use a class I have to create an instance
>>of
>>it, right?
>No.
>>
>There are two types of methods on classes. Instance methods and
>Shared
>methods.
>>
>An instance method is declared:
>Public Sub Foo()
>...
>End Sub
>>
>A shared method is declared:
>Public Shared Sub Bar()
>...
>End Sub
>>
>If the class is called Foobar, then to call Foo:
>>
> dim o as new Foobar
> o.Foo()
>>
>Notice I had to create an instance first. But to call Bar:
>>
> Foobar.Bar()
>>
>I don't have to create an instance because it is _shared_. I simply
>use the name of the class. In C++-speak, it's a static method. In
>OOP
>speak, a _class_ method.
>>
>Example in the framework:
>Int32.Parse("42")
>>

Jul 5 '06 #12

P: n/a
cj
My fault it's Instantiation not Instigation which frankly now that I've
looked up both in the dictionary Instantiation is to create while
Instigation means to start. Still seem quite the same. No wonder I
always thought it was Instigation.
Marina Levit [MVP] wrote:
Sorry, I don't know what 'instigation' is. Let's say you have a class named
MyClass with a shared method called MySharedMethod.

In your code, you can just call MyClass.MySharedMethod(). That is all. You
don't need to do anything else.

There is no object created here - there is no instance of MyClass.
MySharedMethod belongs to the type, and not to any particular instance of
that type.

"cj" <cj@nospam.nospamwrote in message
news:up**************@TK2MSFTNGP02.phx.gbl...
>Ok, I see now the S icon which says the synchronized method is the only
method in the queue class that is thread safe and that explains that line
about the synchronized wrapper. So two things are running through my head
now. 1. I guess my using synclock is a good way of making my threadcount
class threadsafe so many threads can use it w/o interfering with each
other. Must be as it works. 2. I'm curious about using a shared method.
I keep reading that you have to instigate a class for it to become an
object and use it. Clearly you don't but that confuses me as to how to
view it. Is it an object w/o instigation?

Marina Levit [MVP] wrote:
>>There is usually an icon in the documentation to indicate that a method
is shared. When you look at the help for that method, it says it is
shared there as well.

A lot of these classes don't actually have any useful shared methods that
you would ever call. You would always end up creating an instance of the
class, at which point those methods on that object are not thread safe.

Some classes might actually have shared methods that you would want to
call. It all depends on the class.

"cj" <cj@nospam.nospamwrote in message
news:%2****************@TK2MSFTNGP03.phx.gbl.. .
Ok, believe it or not were making progress. I think between my
threadcount class and Travers examples I'm getting an idea of how to
write a class that's threadsafe or not.

But for MS classes... Right now I'm looking at the Queue class and it
says, "Public static (Shared in Visual Basic) members of this type are
safe for multithreaded operations." How do I tell which of the methods
listed under Queue Members are public static? They list Public
Constructor, Public Properties, Public Methods, and protected Methods. I
see the thread safe message a lot and I would like to know what exactly
it's saying is and isn't threadsafe about the class or how I use it. If
there is a better MS class example than the Queue class feel free to
point it out.
Marina Levit [MVP] wrote:
No, having a method declared as Shared does not automatically make it
thread safe.
>
But if there is a note in the documentation that says it is thread
safe, then developers of that method took precautions to make sure it
is.
>
"cj" <cj@nospam.nospamwrote in message
news:un**************@TK2MSFTNGP02.phx.gbl.. .
>Ok.
>>
>But the act of declaring Public Shared alone doesn't make it
>threadsafe does it? I have this class MyThreadCount (see below) which
>creates public shared classes but I was told I had to use the synclock
>to keep multiple threads from manipulating the count at the same time.
>Is this true?
>>
> Public Class MyThreadCount
>>
> Private Shared m_lock As New Object
> Private Shared m_threadcount As Int32 = 0
>>
> Public Shared Sub Increment()
> SyncLock (m_lock)
> m_threadcount += 1
> End SyncLock
> End Sub
>>
> Public Shared Sub Decrement()
> SyncLock (m_lock)
> m_threadcount -= 1
> End SyncLock
> End Sub
>>
> Public Shared ReadOnly Property ThreadCount() As Int32
> Get
> Dim _count As Int32
> SyncLock (m_lock)
> _count = m_threadcount
> End SyncLock
> Return _count
> End Get
> End Property
> End Class
>>
>>
>Travers Naran wrote:
>>cj wrote:
>>>Sorry but to me these two situations sound the same. I don't
>>>understand
>>>what the difference is. To use a class I have to create an instance
>>>of
>>>it, right?
>>No.
>>>
>>There are two types of methods on classes. Instance methods and
>>Shared
>>methods.
>>>
>>An instance method is declared:
>>Public Sub Foo()
>>...
>>End Sub
>>>
>>A shared method is declared:
>>Public Shared Sub Bar()
>>...
>>End Sub
>>>
>>If the class is called Foobar, then to call Foo:
>>>
>> dim o as new Foobar
>> o.Foo()
>>>
>>Notice I had to create an instance first. But to call Bar:
>>>
>> Foobar.Bar()
>>>
>>I don't have to create an instance because it is _shared_. I simply
>>use the name of the class. In C++-speak, it's a static method. In
>>OOP
>>speak, a _class_ method.
>>>
>>Example in the framework:
>>Int32.Parse("42")
>>>

Jul 5 '06 #13

P: n/a
Hi Cj,

Do you understand the difference between Shared methods and normal object
methods? This is a key concept in OOP area. Normally, Shared methods
belongs to the class itself, while normal object methods belongs to certain
instance of the class. So invoking Shared methods needs only the class
name, not initializing an object instance, while invoking an object method,
you have to create an instance of the class first and use this object
instance reference to invoke the method.

From "Queue Class" in MSDN, we can read that:
"Public static (Shared in Visual Basic) members of this type are safe for
multithreaded operations. Instance members are not guaranteed to be
thread-safe."

So Queue.Synchronized(this is the only shared/static member of Queue class)
method can be invoked by multithreads without any problem, while other
members of "Queue Class" should be protected with synclock.

Hope this is clear.

Best regards,
Jeffrey Tan
Microsoft Online Community Support
==================================================
When responding to posts, please "Reply to Group" via your newsreader so
that others may learn and benefit from your issue.
==================================================
This posting is provided "AS IS" with no warranties, and confers no rights.

Jul 6 '06 #14

P: n/a
cj,

Your application has this patron in memory when you are running

Main module part 'created by the mainform or by yourself
Modules or Shared classes what both is the same

Somewhere temporary in memory as long as needed managed by your managed code
Instanced objects

Very confusing is that some people call often an object a Class and typical
C# people call a module as well a class (static class although there is in
my idea not much static anymore about it).

A class is nothing more than a template from a certain type that can be
instanced.

When I did read yesterday the message from Marina, I had the idea that she
had made a kind of typo telling that a shared class did belong to a type,
while it is to the main (stack) modules or in C# language main static class.

I had however the idea that you did understand it, therefore I did not place
any message.

I hope this makes it a little bit clearer.

Cor
"cj" <cj@nospam.nospamschreef in bericht
news:%2****************@TK2MSFTNGP05.phx.gbl...
My fault it's Instantiation not Instigation which frankly now that I've
looked up both in the dictionary Instantiation is to create while
Instigation means to start. Still seem quite the same. No wonder I
always thought it was Instigation.
Marina Levit [MVP] wrote:
>Sorry, I don't know what 'instigation' is. Let's say you have a class
named MyClass with a shared method called MySharedMethod.

In your code, you can just call MyClass.MySharedMethod(). That is all.
You don't need to do anything else.

There is no object created here - there is no instance of MyClass.
MySharedMethod belongs to the type, and not to any particular instance of
that type.

"cj" <cj@nospam.nospamwrote in message
news:up**************@TK2MSFTNGP02.phx.gbl...
>>Ok, I see now the S icon which says the synchronized method is the only
method in the queue class that is thread safe and that explains that
line about the synchronized wrapper. So two things are running through
my head now. 1. I guess my using synclock is a good way of making my
threadcount class threadsafe so many threads can use it w/o interfering
with each other. Must be as it works. 2. I'm curious about using a
shared method. I keep reading that you have to instigate a class for it
to become an object and use it. Clearly you don't but that confuses me
as to how to view it. Is it an object w/o instigation?

Marina Levit [MVP] wrote:
There is usually an icon in the documentation to indicate that a method
is shared. When you look at the help for that method, it says it is
shared there as well.

A lot of these classes don't actually have any useful shared methods
that you would ever call. You would always end up creating an instance
of the class, at which point those methods on that object are not
thread safe.

Some classes might actually have shared methods that you would want to
call. It all depends on the class.

"cj" <cj@nospam.nospamwrote in message
news:%2****************@TK2MSFTNGP03.phx.gbl. ..
Ok, believe it or not were making progress. I think between my
threadcount class and Travers examples I'm getting an idea of how to
write a class that's threadsafe or not.
>
But for MS classes... Right now I'm looking at the Queue class and it
says, "Public static (Shared in Visual Basic) members of this type are
safe for multithreaded operations." How do I tell which of the
methods listed under Queue Members are public static? They list
Public Constructor, Public Properties, Public Methods, and protected
Methods. I see the thread safe message a lot and I would like to know
what exactly it's saying is and isn't threadsafe about the class or
how I use it. If there is a better MS class example than the Queue
class feel free to point it out.
>
>
Marina Levit [MVP] wrote:
>No, having a method declared as Shared does not automatically make it
>thread safe.
>>
>But if there is a note in the documentation that says it is thread
>safe, then developers of that method took precautions to make sure it
>is.
>>
>"cj" <cj@nospam.nospamwrote in message
>news:un**************@TK2MSFTNGP02.phx.gbl. ..
>>Ok.
>>>
>>But the act of declaring Public Shared alone doesn't make it
>>threadsafe does it? I have this class MyThreadCount (see below)
>>which creates public shared classes but I was told I had to use the
>>synclock to keep multiple threads from manipulating the count at the
>>same time. Is this true?
>>>
>> Public Class MyThreadCount
>>>
>> Private Shared m_lock As New Object
>> Private Shared m_threadcount As Int32 = 0
>>>
>> Public Shared Sub Increment()
>> SyncLock (m_lock)
>> m_threadcount += 1
>> End SyncLock
>> End Sub
>>>
>> Public Shared Sub Decrement()
>> SyncLock (m_lock)
>> m_threadcount -= 1
>> End SyncLock
>> End Sub
>>>
>> Public Shared ReadOnly Property ThreadCount() As Int32
>> Get
>> Dim _count As Int32
>> SyncLock (m_lock)
>> _count = m_threadcount
>> End SyncLock
>> Return _count
>> End Get
>> End Property
>> End Class
>>>
>>>
>>Travers Naran wrote:
>>>cj wrote:
>>>>Sorry but to me these two situations sound the same. I don't
>>>>understand
>>>>what the difference is. To use a class I have to create an
>>>>instance of
>>>>it, right?
>>>No.
>>>>
>>>There are two types of methods on classes. Instance methods and
>>>Shared
>>>methods.
>>>>
>>>An instance method is declared:
>>>Public Sub Foo()
>>>...
>>>End Sub
>>>>
>>>A shared method is declared:
>>>Public Shared Sub Bar()
>>>...
>>>End Sub
>>>>
>>>If the class is called Foobar, then to call Foo:
>>>>
>>> dim o as new Foobar
>>> o.Foo()
>>>>
>>>Notice I had to create an instance first. But to call Bar:
>>>>
>>> Foobar.Bar()
>>>>
>>>I don't have to create an instance because it is _shared_. I
>>>simply
>>>use the name of the class. In C++-speak, it's a static method. In
>>>OOP
>>>speak, a _class_ method.
>>>>
>>>Example in the framework:
>>>Int32.Parse("42")
>>>>
Jul 6 '06 #15

P: n/a
cj
Jeffrey and Cor, I keep hearing and even read in Cor's response "A
class is nothing more than a template from a certain type that can be
instanced." yet if it's a shared method in a class the class doesn't
have to be instanced. I'm trying to think in the cookie cutter as a
class and each cookie as an instance of it. Yet it appears the cookie
cutter has shared methods and can be used without making a cookie. What
would be an example of this?

Then in this code I'm currently using I never make an instance of this
class yet it functions. I know it's defined as Public Class. So why do
I keep hearing a class is a model like a cookie cutter to make instances
of (cookies) and then in practice it appears many times a class doesn't
need an instance made of it at all?

And what if a class had a shared method and instances are made of it?
How could this work? Would all instances change when the shared method
is used? Can you give me a cookie cutter example of that?

Public Class MyThreadCount

Private Shared m_lock As New Object
Private Shared m_threadcount As Int32 = 0

Public Shared Sub Increment()
SyncLock (m_lock)
m_threadcount += 1
End SyncLock
End Sub

Public Shared Sub Decrement()
SyncLock (m_lock)
m_threadcount -= 1
End SyncLock
End Sub

Public Shared ReadOnly Property ThreadCount() As Int32
Get
Dim _count As Int32
SyncLock (m_lock)
_count = m_threadcount
End SyncLock
Return _count
End Get
End Property
End Class


Cor Ligthert [MVP] wrote:
cj,

Your application has this patron in memory when you are running

Main module part 'created by the mainform or by yourself
Modules or Shared classes what both is the same

Somewhere temporary in memory as long as needed managed by your managed code
Instanced objects

Very confusing is that some people call often an object a Class and typical
C# people call a module as well a class (static class although there is in
my idea not much static anymore about it).

A class is nothing more than a template from a certain type that can be
instanced.

When I did read yesterday the message from Marina, I had the idea that she
had made a kind of typo telling that a shared class did belong to a type,
while it is to the main (stack) modules or in C# language main static class.

I had however the idea that you did understand it, therefore I did not place
any message.

I hope this makes it a little bit clearer.

Cor
"cj" <cj@nospam.nospamschreef in bericht
news:%2****************@TK2MSFTNGP05.phx.gbl...
>My fault it's Instantiation not Instigation which frankly now that I've
looked up both in the dictionary Instantiation is to create while
Instigation means to start. Still seem quite the same. No wonder I
always thought it was Instigation.
Marina Levit [MVP] wrote:
>>Sorry, I don't know what 'instigation' is. Let's say you have a class
named MyClass with a shared method called MySharedMethod.

In your code, you can just call MyClass.MySharedMethod(). That is all.
You don't need to do anything else.

There is no object created here - there is no instance of MyClass.
MySharedMethod belongs to the type, and not to any particular instance of
that type.

"cj" <cj@nospam.nospamwrote in message
news:up**************@TK2MSFTNGP02.phx.gbl...
Ok, I see now the S icon which says the synchronized method is the only
method in the queue class that is thread safe and that explains that
line about the synchronized wrapper. So two things are running through
my head now. 1. I guess my using synclock is a good way of making my
threadcount class threadsafe so many threads can use it w/o interfering
with each other. Must be as it works. 2. I'm curious about using a
shared method. I keep reading that you have to instigate a class for it
to become an object and use it. Clearly you don't but that confuses me
as to how to view it. Is it an object w/o instigation?

Marina Levit [MVP] wrote:
There is usually an icon in the documentation to indicate that a method
is shared. When you look at the help for that method, it says it is
shared there as well.
>
A lot of these classes don't actually have any useful shared methods
that you would ever call. You would always end up creating an instance
of the class, at which point those methods on that object are not
thread safe.
>
Some classes might actually have shared methods that you would want to
call. It all depends on the class.
>
"cj" <cj@nospam.nospamwrote in message
news:%2****************@TK2MSFTNGP03.phx.gbl.. .
>Ok, believe it or not were making progress. I think between my
>threadcount class and Travers examples I'm getting an idea of how to
>write a class that's threadsafe or not.
>>
>But for MS classes... Right now I'm looking at the Queue class and it
>says, "Public static (Shared in Visual Basic) members of this type are
>safe for multithreaded operations." How do I tell which of the
>methods listed under Queue Members are public static? They list
>Public Constructor, Public Properties, Public Methods, and protected
>Methods. I see the thread safe message a lot and I would like to know
>what exactly it's saying is and isn't threadsafe about the class or
>how I use it. If there is a better MS class example than the Queue
>class feel free to point it out.
>>
>>
>Marina Levit [MVP] wrote:
>>No, having a method declared as Shared does not automatically make it
>>thread safe.
>>>
>>But if there is a note in the documentation that says it is thread
>>safe, then developers of that method took precautions to make sure it
>>is.
>>>
>>"cj" <cj@nospam.nospamwrote in message
>>news:un**************@TK2MSFTNGP02.phx.gbl.. .
>>>Ok.
>>>>
>>>But the act of declaring Public Shared alone doesn't make it
>>>threadsafe does it? I have this class MyThreadCount (see below)
>>>which creates public shared classes but I was told I had to use the
>>>synclock to keep multiple threads from manipulating the count at the
>>>same time. Is this true?
>>>>
>>> Public Class MyThreadCount
>>>>
>>> Private Shared m_lock As New Object
>>> Private Shared m_threadcount As Int32 = 0
>>>>
>>> Public Shared Sub Increment()
>>> SyncLock (m_lock)
>>> m_threadcount += 1
>>> End SyncLock
>>> End Sub
>>>>
>>> Public Shared Sub Decrement()
>>> SyncLock (m_lock)
>>> m_threadcount -= 1
>>> End SyncLock
>>> End Sub
>>>>
>>> Public Shared ReadOnly Property ThreadCount() As Int32
>>> Get
>>> Dim _count As Int32
>>> SyncLock (m_lock)
>>> _count = m_threadcount
>>> End SyncLock
>>> Return _count
>>> End Get
>>> End Property
>>> End Class
>>>>
>>>>
>>>Travers Naran wrote:
>>>>cj wrote:
>>>>>Sorry but to me these two situations sound the same. I don't
>>>>>understand
>>>>>what the difference is. To use a class I have to create an
>>>>>instance of
>>>>>it, right?
>>>>No.
>>>>>
>>>>There are two types of methods on classes. Instance methods and
>>>>Shared
>>>>methods.
>>>>>
>>>>An instance method is declared:
>>>>Public Sub Foo()
>>>>...
>>>>End Sub
>>>>>
>>>>A shared method is declared:
>>>>Public Shared Sub Bar()
>>>>...
>>>>End Sub
>>>>>
>>>>If the class is called Foobar, then to call Foo:
>>>>>
>>>> dim o as new Foobar
>>>> o.Foo()
>>>>>
>>>>Notice I had to create an instance first. But to call Bar:
>>>>>
>>>> Foobar.Bar()
>>>>>
>>>>I don't have to create an instance because it is _shared_. I
>>>>simply
>>>>use the name of the class. In C++-speak, it's a static method. In
>>>>OOP
>>>>speak, a _class_ method.
>>>>>
>>>>Example in the framework:
>>>>Int32.Parse("42")
>>>>>
Jul 6 '06 #16

P: n/a
cj,

I tried to keep it as short as possible however the names that are used and
are just from history are very confusing.
..
A Shared Class is nothing more as a module you could have written it as well
in VB as this.

Public Module MyThreadCount
Private As New Object
Private m_threadcount As Int32 = 0
Public Sub Sub Increment()
SyncLock (m_lock)
m_threadcount += 1
End SyncLock
End Sub

etc.

A shared class is called in past a static class. In mine opinion is the name
completely false.

It is a class that is direct used as a module, it has no constructor (Sub
New).

I hope this gives an idea?

Cor
Jul 6 '06 #17

P: n/a
cj
Yes, that helps. Just another case of confusing names and terms.

I'm still wondering can a class have shared methods and have instances
of it?
Cor Ligthert [MVP] wrote:
cj,

I tried to keep it as short as possible however the names that are used and
are just from history are very confusing.
.
A Shared Class is nothing more as a module you could have written it as well
in VB as this.

Public Module MyThreadCount
Private As New Object
Private m_threadcount As Int32 = 0
Public Sub Sub Increment()
SyncLock (m_lock)
m_threadcount += 1
End SyncLock
End Sub

etc.

A shared class is called in past a static class. In mine opinion is the name
completely false.

It is a class that is direct used as a module, it has no constructor (Sub
New).

I hope this gives an idea?

Cor

Jul 6 '06 #18

P: n/a
cj wrote:
Yes, that helps. Just another case of confusing names and terms.

I'm still wondering can a class have shared methods and have instances
of it?
Yes. When you declare a Class, think of it creating a single object of
that type that will be the template for all others. It's an object in
and of itself. Clear your mind of thread-safe because it's not
relevant to Shared vs. Instance at this moment.

Public Class Foobar

Public Shared Shared_N as Integer
Public Instance_N as Integer

Public Shared Sub FooShared()
Shared_N = Shared_N + 1
End Sub

Public Sub BarInstance()
Instance_N = Instance_N + 1
End Sub

Public Sub Hybrid()
Instance_N = Instance_N + 1
Shared_N = Shared_N + 1 ' An instance can access shared variables
End Sub
End Class

I can then do the following:

Foobar.FooShared()
System.Console.WriteLine(Foobar.Shared_N)

But what if I create an instance? Try this:

Dim f as New Foobar

f.FooShared()
System.Console.WriteLine(f.Shared_N)
System.Console.WriteLine(Foobar.Shared_N) '' <== EXACTLY the same
memory space as f.Shared_N

f.FooShared() '' <== EXACTLY the same method is called as
Foobar.FooShared()

A shared member (field or method) can be called straight on the class
object. It can also be called or referenced by instance methods.

Jul 6 '06 #19

This discussion thread is closed

Replies have been disabled for this discussion.