ReaderWriterLockSlim类是.NET框架提供的一个轻量级的,写入托管代码中的能产生更优性能的锁
代码如下:
Imports System
Imports System.Threading
Imports System.Diagnostics
Imports System.Diagnostics.ThreadState
Module Module1
Sub Main()
Dim mythread1 As Thread
Dim mythread2 As Thread
Dim mythread3 As Thread
'创建线程对象
mythread1 = New Thread(AddressOf mythreadrun)
mythread2 = New Thread(AddressOf mythreadrun)
mythread3 = New Thread(AddressOf mythreadrun)
mythread1.Name = "thread_1"
mythread2.Name = "thread_2"
mythread3.Name = "thread_3"
'设置线程是否允许动态优先级
Console.WriteLine(Now.ToLongTimeString & "线程对象创建完毕,开始执行线程")
Dim myprocess As Process = Process.GetCurrentProcess()
Console.WriteLine("进程名称:" & myprocess.ProcessName)
'执行线程
mythread1.Start(myprocess)
mythread2.Start(myprocess)
mythread3.Start(myprocess)
'等待线程完成
mythread1.Join()
mythread2.Join()
mythread3.Join()
'线程执行完毕
Console.WriteLine(Now.ToLongTimeString & "线程执行完毕!")
End Sub
Public Sub mythreadrun(ByVal myprocess As Object)
Dim mynum As Double
Static myLock As New ReaderWriterLockSlim()
Static Dim jg As Double = 100
Try
For mynum = 1 To 10
'在5毫秒内尝试获得写锁
If myLock.TryEnterWriteLock(5) Then
jg -= mynum
Console.WriteLine(Thread.CurrentThread.Name & "==>" & Now.ToLongTimeString & "=>" & (jg + mynum) & "-" & mynum & ",计算结果为:" & jg)
'退出写锁
Thread.Sleep(2)
myLock.ExitWriteLock()
Else
Console.WriteLine(Thread.CurrentThread.Name & "==>" & Now.ToLongTimeString & "=>获得写锁失败")
End If
Next
Catch
Console.WriteLine(Thread.CurrentThread.Name & " " & Now.ToLongTimeString & "线程异常终止!")
'终止线程
Thread.CurrentThread.Abort()
Finally
Console.WriteLine(Thread.CurrentThread.Name & "优先级: " & Thread.CurrentThread.Priority.ToString)
Console.WriteLine(Thread.CurrentThread.Name & " " & Now.ToLongTimeString & "线程运行完毕!")
End Try
End Sub
End Module
上面用到的方法如下:
TryEnterWriteLock(Int32) 尝试进入写入模式锁定状态,可以选择超时时间。
TryEnterWriteLock(TimeSpan) 尝试进入写入模式锁定状态,可以选择超时时间。
ExitWriteLock 减少写入模式的递归计数,并在生成的计数为 0(零)时退出写入模式。
ReaderWriterLockSlim 类
表示用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问。
相关方法如下:
Dispose 释放 ReaderWriterLockSlim 类的当前实例所使用的所有资源。
EnterReadLock 尝试进入读取模式锁定状态。
EnterUpgradeableReadLock 尝试进入可升级模式锁定状态。
EnterWriteLock 尝试进入写入模式锁定状态。
Equals(Object) 确定指定的 Object 是否等于当前的 Object。 (继承自 Object。)
ExitReadLock 减少读取模式的递归计数,并在生成的计数为 0(零)时退出读取模式。
ExitUpgradeableReadLock 减少可升级模式的递归计数,并在生成的计数为 0(零)时退出可升级模式。
ExitWriteLock 减少写入模式的递归计数,并在生成的计数为 0(零)时退出写入模式。
Finalize 允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自 Object。)
GetHashCode 用作特定类型的哈希函数。 (继承自 Object。)
GetType 获取当前实例的 Type。 (继承自 Object。)
MemberwiseClone 创建当前 Object 的浅表副本。 (继承自 Object。)
ToString 返回表示当前对象的字符串。 (继承自 Object。)
TryEnterReadLock(Int32) 尝试进入读取模式锁定状态,可以选择整数超时时间。
TryEnterReadLock(TimeSpan) 尝试进入读取模式锁定状态,可以选择超时时间。
TryEnterUpgradeableReadLock(Int32) 尝试进入可升级模式锁定状态,可以选择超时时间。
TryEnterUpgradeableReadLock(TimeSpan) 尝试进入可升级模式锁定状态,可以选择超时时间。
TryEnterWriteLock(Int32) 尝试进入写入模式锁定状态,可以选择超时时间。
TryEnterWriteLock(TimeSpan) 尝试进入写入模式锁定状态,可以选择超时时间。
效果如下: