Stack.Synchronized(Stack) Yöntem
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
için eşitlenmiş (iş parçacığı güvenli) sarmalayıcı döndürür Stack.
public:
static System::Collections::Stack ^ Synchronized(System::Collections::Stack ^ stack);
public static System.Collections.Stack Synchronized (System.Collections.Stack stack);
static member Synchronized : System.Collections.Stack -> System.Collections.Stack
Public Shared Function Synchronized (stack As Stack) As Stack
Parametreler
Döndürülenler
çevresinde Stackeşitlenmiş bir sarmalayıcı.
Özel durumlar
stack
, null
değeridir.
Örnekler
Aşağıdaki örnek, bir Stacköğesinin eşitlenip eşitlenmediğini Stack belirlemeyi ve eşitlenmiş Stackbir öğesini kullanmayı gösterir.
#using <system.dll>
using namespace System;
using namespace System::Collections;
int main()
{
// Creates and initializes a new Stack.
Stack^ myStack = gcnew Stack;
myStack->Push( "The" );
myStack->Push( "quick" );
myStack->Push( "brown" );
myStack->Push( "fox" );
// Creates a synchronized wrapper around the Stack.
Stack^ mySyncdStack = Stack::Synchronized( myStack );
// Displays the sychronization status of both Stacks.
Console::WriteLine( "myStack is {0}.", myStack->IsSynchronized ? (String^)"synchronized" : "not synchronized" );
Console::WriteLine( "mySyncdStack is {0}.", mySyncdStack->IsSynchronized ? (String^)"synchronized" : "not synchronized" );
}
/*
This code produces the following output.
myStack is not synchronized.
mySyncdStack is synchronized.
*/
using System;
using System.Collections;
public class SamplesStack
{
public static void Main()
{
// Creates and initializes a new Stack.
Stack myStack = new Stack();
myStack.Push("The");
myStack.Push("quick");
myStack.Push("brown");
myStack.Push("fox");
// Creates a synchronized wrapper around the Stack.
Stack mySyncdStack = Stack.Synchronized(myStack);
// Displays the sychronization status of both Stacks.
Console.WriteLine("myStack is {0}.",
myStack.IsSynchronized ? "synchronized" : "not synchronized");
Console.WriteLine("mySyncdStack is {0}.",
mySyncdStack.IsSynchronized ? "synchronized" : "not synchronized");
}
}
/*
This code produces the following output.
myStack is not synchronized.
mySyncdStack is synchronized.
*/
Imports System.Collections
Public Class SamplesStack
Public Shared Sub Main()
' Creates and initializes a new Stack.
Dim myStack As New Stack()
myStack.Push("The")
myStack.Push("quick")
myStack.Push("brown")
myStack.Push("fox")
' Creates a synchronized wrapper around the Stack.
Dim mySyncdStack As Stack = Stack.Synchronized(myStack)
' Displays the sychronization status of both Stacks.
Dim msg As String
If myStack.IsSynchronized Then
msg = "synchronized"
Else
msg = "not synchronized"
End If
Console.WriteLine("myStack is {0}.", msg)
If mySyncdStack.IsSynchronized Then
msg = "synchronized"
Else
msg = "not synchronized"
End If
Console.WriteLine("mySyncdStack is {0}.", msg)
End Sub
End Class
' This code produces the following output.
'
' myStack is not synchronized.
' mySyncdStack is synchronized.
Açıklamalar
öğesinin iş parçacığı güvenliğini garanti etmek için tüm işlemlerin Stackbu sarmalayıcı aracılığıyla yapılması gerekir.
Bir koleksiyon ile numaralandırma, aslında iş parçacığı açısından güvenli yordam değildir. Bir koleksiyon eşitlendiği zaman bile, diğer iş parçacıkları numaralandırıcının özel durum oluşturmasına neden olan koleksiyonu değiştirebilir. Numaralandırma sırasında iş parçacığı güvenliği sağlamak için tüm numaralandırma sırasında koleksiyonu kilitleyebilir veya diğer iş parçacıkları tarafından yapılan değişikliklerden kaynaklanan özel durumları yakalayabilirsiniz.
Aşağıdaki kod örneği, tüm numaralandırma sırasında kullanarak SyncRoot koleksiyonun nasıl kilitlenmesini göstermektedir.
Stack^ myCollection = gcnew Stack();
bool lockTaken = false;
try
{
Monitor::Enter(myCollection->SyncRoot, lockTaken);
for each (Object^ item in myCollection);
{
// Insert your code here.
}
}
finally
{
if (lockTaken)
{
Monitor::Exit(myCollection->SyncRoot);
}
}
Stack myCollection = new Stack();
lock (myCollection.SyncRoot)
{
foreach (object item in myCollection)
{
// Insert your code here.
}
}
Dim myCollection As New Stack()
SyncLock myCollection.SyncRoot
For Each item As Object In myCollection
' Insert your code here.
Next item
End SyncLock
Bu yöntem bir O(1)
işlemdir.