« 2005年04月 | メイン | 2005年06月 »

2005年05月 アーカイブ

2005年05月04日

MonitorクラスとSyncLockキーワードとの比較

MSDN Magazine Febrary 2005の記事を検証してみました。

http://msdn.microsoft.com/msdnmag/issues/05/02/BasicInstincts/default.aspx

といっても、メインのテーマではなくて、まずはMonitorクラスとSyncLockとの類似点(あるいは相違点)の確認。
#言うまでもなく、SyncLockはVisual Basic .NETのキーワード。C#ではlockです。

以下のような簡単なコードを書いてみました。
Pointを表す単純なクラスをMonitorを使う方法とSyncLockを使う方法とで比較するものです。

----------------------------------------------------------------
Imports System.Threading


Public Class PointMonitor
  Private x As Integer
  Private y As Integer

  Sub New(ByVal x As Integer, ByVal y As Integer)
    Me.x = x
    Me.y = y
  End Sub

  Sub GetPointPosition(ByRef x As Integer, ByRef y As Integer)
    Monitor.Enter(Me)
    Try
      x = Me.x
      y = Me.y
    Finally
      Monitor.Exit(Me)
    End Try
  End Sub

  Sub SetPointPosition(ByVal x As Integer, ByVal y As Integer)
    Monitor.Enter(Me)
    Try
      Me.x = x
      Me.y = y
    Finally
      Monitor.Exit(Me)
    End Try
  End Sub
End Class


Public Class PointLock
  Private x As Integer
  Private y As Integer

  Sub New(ByVal x As Integer, ByVal y As Integer)
    Me.x = x
    Me.y = y
  End Sub

  Sub GetPointPosition(ByRef x As Integer, ByRef y As Integer)
    SyncLock Me
      x = Me.x
      y = Me.y
    End SyncLock
  End Sub

  Sub SetPointPosition(ByVal x As Integer, ByVal y As Integer)
    SyncLock Me
      Me.x = x
      Me.y = y
    End SyncLock
  End Sub
End Class
----------------------------------------------------------------

これをビルド(Release Build)して、ディスアセンブラ(Ildasm.exe)を使って、実際にどのようなMSILコードが生成されたのか見てみました。

------ PointMonitorクラスのGetPointPositionメソッド ------
.method public instance void GetPointPosition(int32& x, int32& y) cil managed
{
// コード サイズ 32 (0x20)
.maxstack 2
IL_0000: ldarg.0
IL_0001: call void [mscorlib]System.Threading.Monitor::Enter(object)
.try
{
IL_0006: ldarg.1
IL_0007: ldarg.0
IL_0008: ldfld int32 LockTest.PointMonitor::x
IL_000d: stind.i4
IL_000e: ldarg.2
IL_000f: ldarg.0
IL_0010: ldfld int32 LockTest.PointMonitor::y
IL_0015: stind.i4
IL_0016: leave.s IL_001f
} // end .try
finally
{
IL_0018: ldarg.0
IL_0019: call void [mscorlib]System.Threading.Monitor::Exit(object)
IL_001e: endfinally
} // end handler
IL_001f: ret
} // end of method PointMonitor::GetPointPosition
----------------------------------------------------------

------ PointLockクラスのGetPointPositionメソッド ------
.method public instance void GetPointPosition(int32& x, int32& y) cil managed
{
// コード サイズ 34 (0x22)
.maxstack 2
.locals init (class LockTest.PointLock V_0)
IL_0000: ldarg.0
IL_0001: stloc.0
IL_0002: ldloc.0
IL_0003: call void [mscorlib]System.Threading.Monitor::Enter(object)
.try
{
IL_0008: ldarg.1
IL_0009: ldarg.0
IL_000a: ldfld int32 LockTest.PointLock::x
IL_000f: stind.i4
IL_0010: ldarg.2
IL_0011: ldarg.0
IL_0012: ldfld int32 LockTest.PointLock::y
IL_0017: stind.i4
IL_0018: leave.s IL_0021
} // end .try
finally
{
IL_001a: ldloc.0
IL_001b: call void [mscorlib]System.Threading.Monitor::Exit(object)
IL_0020: endfinally
} // end handler
IL_0021: ret
} // end of method PointLock::GetPointPosition
-------------------------------------------------------

Monitorを使う方がわずかにコードサイズは小さいようですが、ほぼ違いはないと言っていいでしょう。結局SyncLockの方もコンパイルするとMonitor.Enterが使われていますし。

ということでSyncLockはMonitorを使ってロックする方法に対する簡単な記述を提供してくれるものだということがわかるわけです。
TryだのFinallyだの書かなくていいぶん、コードがシンプルで見やすくなりますね。

とすると、Monitor.Enterを使うのは、言語仕様としてSyncLock(やC#のlock)に相当するキーワードを持っていない言語製品の場合に限られると思っていいかもしれません。あとは、コードでSyncLockを使う場合、頭の中でほぼ等価なMonitor.Enterと置き換えてみて、ロジックの確認をしてみるのはいいことでしょうね。

ただし、SyncLockでは足りないこともあって、それはアクセスの競合が発生した場合のタイムアウトが必要な場合。この時はMonitor.TryEnterメソッドを使うことになります。

上記の記事はなかなか興味深い内容になっています。一読をお勧めします。

2005年05月06日

資格取得に自腹で1万5000円は多いか、少ないか

「資格取得に自腹で1万5000円は多いか、少ないか」

http://jibun.atmarkit.co.jp/lcareer01/rensai/career13/data13.html

私はサラリーマンではないので単純に比較できませんが、資格取得に限らず自己啓発やら自習やらのために月に1万5000円はかけていいと思います。
ただ確かに自分がサラリーマンの頃は、必要だと思ってもそれだけのお金を使わないことも多かったのは事実。そもそも、ないところからはどうがんばってもお金は出ないので。

スキルアップのためにはお金は必要だけど、お金を得るためにはまずスキルアップしないといけない、・・・鶏と卵ですね。

2005年05月08日

XMLの知識はITエンジニアの基本

「XMLの知識はITエンジニアの基本に」,技術認定試験が改定

http://itpro.nikkeibp.co.jp/free/ITPro/NEWS/20050502/160390/

今どきはあちこちにXMLが顔を出してきて、なんとなく使えた気分になってしまいそうです。特にVisual Studioなんか触ってると、さらに少ない理解でもなんかXMLを使っていたりします。
でも、いざとなると体系立てて理解しているかどうかが重要になってきます。

改めてXMLの勉強が必要かもしれません。

2005年05月09日

Virtual PC 2004で動くOS、動かないOS

What Works and What Doesn't in Microsoft Virtual PC 2004

http://vpc.visualwin.com/


自分の別ブログに投稿したものはこちら
開発者にとってはVirtual PCはかなり便利なソフトウェアなので、使っている方もそれなりにいるように思います。
ゲストOSとしてマイクロソフトのOSをインストールするのは簡単なのですが、Linux等のサポート対象外のOSの場合は多少苦労することがあります。そのようなときに役立つサイトです。

2005年05月10日

Project Harmony

アパッチのメンバーら、「Project Harmony」でオープンソース版J2SE開発へ

http://japan.cnet.com/news/ent/story/0,2000047623,20083372,00.htm

オープンソースのJ2SEだそうです。
・・・なぜ?今までかたくなに拒否してきたのに?
テストガイドラインに従わざるを得ないので、非互換性は発生しないって本当?
テストガイドラインに合格したにもかかわらずマイクロソフト製VMを否定したのはなぜ?

どうもこういうポリシーが定まらないやり方って疑問に思うんですけど、皆はほんとに不思議に思わないものでしょうか?

2005年05月11日

Code Complete 第2版のブックレビュー

http://www.atmarkit.co.jp/fdotnet/bookpreview/codecomp2nd_24/codecomp2nd_24_01.html

名著Code Completeの24章、リファクタリングの章が丸ごと読めます。
Code Complete自体を早く買って早く読まないといけないんですが、読みたい本が山積みでなかなか手が出ません。

2005年05月14日

Configuring ClickOnce Trusted Publishers

http://msdn.microsoft.com/smartclient/default.aspx?pull=/library/en-us/dnwinforms/html/clickoncetrustpub.asp

出ました、ClickOnceのセキュリティに関する記事。
#探せば前から他の情報があったのかもしれません。そうだったらすみません、勉強不足です。

2005でVisual Studioに追加された機能である、App.configのデザイン画面で設定すればいいようですね。

2005年05月15日

The Future of the Platform

The .NET Show: The Future of the Platform

http://msdn.microsoft.com/theshow/episode.aspx?xml=theshow/en/episode050/manifest.xml

まださわりの部分しか見ていませんが、これは必見、面白そうなコンテンツです。
文字通り、マイクロソフトのPlatformがこれからどうなるのか、どうしようとしているのかを語り合っています。
日本語訳はありませんがトランスクリプトの表示はできますので、がんばって視聴してみましょう。

2005年05月16日

MSDN Mag Mar 2005の記事ピックアップ

2月号に続いて、完全に投稿が遅すぎですが。
MSDN Magazine March 2005で個人的に気になった記事。

http://msdn.microsoft.com/msdnmag/issues/05/03/default.aspx


・ADVANCED BASICS
http://msdn.microsoft.com/msdnmag/issues/05/03/AdvancedBasics/default.aspx
ディレクトリリスト取得を例にした、マルチスレッドプログラミングの解説。
当然ですがシングルスレッドでは何かの処理に時間がかかるとフロンドエンドの描画まで止まったり、オペレータが他の操作(処理のキャンセルなど)すらできなくなるわけです。
当たり前の内容ですが、こういう機会にもう一度勉強してみましょう。

・INSIDE MSDN
http://msdn.microsoft.com/msdnmag/issues/05/03/InsideMSDN/default.aspx
InfoPathの記事。
私はInfoPathの知識がほとんどないので、この記事をきっかけにInfoPathの使い方を覚えようと思います。

・Combine Web and Windows Services to Run Your ASP.NET Code at Scheduled Intervals
http://msdn.microsoft.com/msdnmag/issues/05/03/SchedulingASPNETCode/default.aspx
WebサービスからWindowsサービスを呼び出す方法の解説。
いわゆるバッチ処理とWebサービスとの組み合わせ方です。バッチ処理はWindowsとしてはもちろんWindowsサービスとして実装するわけですが、これとWebサービスとの連携というかコネクティビティを説明しています。
正直なところ、私にはかなり難しい内容ですが、興味深い記事です。

Visual Basic 2005のマルチスレッドプログラミング

Visual Basic 2005 ここが便利!
第4回 Background Workerで夢のマルチスレッドがついに!

http://www.atmarkit.co.jp/fdotnet/vb2005/vb2005_04/vb2005_04_01.html

Visual Basic 2005で便利になったマルチスレッドプログラミングについての解説。
ただし気をつけないといけないのは、記述は簡単になったとしても基本的な考え方は理解しておかなければならないということです。

2005年05月17日

TechEd 2005のセッション一覧公開

http://www.event-registration.jp/events/te05/technical_session.htm

TechEd 2005 YOKOHAMAのテクニカルセッション一覧が公開されています。
アーキテクト、デベロッパー、ITプロをかなり明確に区分するようになってきた気がします。
というか、前から区分はありましたけど、今はごく普通の言葉としてアーキテクトという用語を使ってますね。

とにもかくにも楽しみです、TechEd。

About 2005年05月

2005年05月にブログ「.NETの覚え書き」に投稿されたすべてのエントリーです。過去のものから新しいものへ順番に並んでいます。

前のアーカイブは2005年04月です。

次のアーカイブは2005年06月です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.34