javaのデッドロックをチェックする

ログを見たところプログラムの処理が停止している。
しかしDB側でデッドロックは発生していないという状況で、プログラム側でデッドロックが発生していないか確認。

1.プロセスIDを確認(jps自体のIDも表示される)

jps

2.スタックを出力

jstack ID

出力の下のほうにスレッドの状態と見つかったデッドロックの数が表示される。

CentOS7 redmine, gitbucket, jenkins

CentOS6ではredmineのインストールがうまくいかなかったため、CentOS7にて以下をインストール。

  • redmine3.2
  • gitbucket*1
  • jenkins

以下、参考にしたサイト。
Redmine 3.2をCentOS 7.1にインストールする手順 | Redmine.JP Blog
CentOS 7でGitBucketを動かしてJenkinsで自動デプロイ – BLACKND
GitBucketを導入してみた - katsu’s diary

注意点

gitbucketはjava8でないと正常に動作しない模様。
ログにエラーが出ていなかったため特に気にしていなかったが、java7では画面が表示されない。

*1:git本体のインストールについては割愛

C# GUIとワーカスレッド

戻り値書いてなかったり、関数の呼び出し順が逆になってる所などあるので後で直します。
修正版シーケンス図。
知識不足のため、UML的に不正確な箇所があると思います。
(並列処理の書き方、DoWork内の処理をLOOPに記載している、など)


※ 2016/05/22 追記
WorkerThreadパターンは、”戻り値を必要としない場合”のパターン。
戻り値が必要な場合はFutureパターンを参照。

C# ConcurrentCollections

ConcurrentCollectionsでスレッドセーフなデータ操作ができる。
ただし、RaceCondition(メソッド呼び出し間に、別スレッド・プロセスの操作により値が書き換わる現象)に注意する。

言語が違っても考え方は同じと思うので、メモしておく。

ConcurrentQueue

スレッドセーフなキュー(FIFO)。

  1. Enqueue
  2. TryDequeue

ConcurrentDictionary

一般的な用途ならこれで十分。
配列として使う場合はスレッドセーフと引き換えに性能が犠牲になる。

  1. TryGetValue
  2. TryAdd
  3. TryUpdate
  4. TryRemove
  5. GetOrAdd
  6. AddOrUpdate

Parallel.ForEach

ループを分割して処理を行う。
ブロック内の処理負荷が大きいほど効果がかる。
こういうものもあるんだなということで。

RaceConditions回避

  1. delegate使用
  2. atomicな操作をする
  3. lockをかける(ただし、手動でロックをかけるため、デッドロックが起こる可能性がある)

Maven pom.xml (1) 依存関係解決とビルド

依存関係

既存プロジェクトからMavenプロジェクトへの変換はぐぐれば出てくるので割愛。
依存関係解決とビルドの設定のみ。
依存ライブラリを含めて1つのjarにしたい場合は、maven-assembly-pluginを使用する。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>jp.ne.jatena.matasaburou</groupId>
	<artifactId>DaoTraining</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<build>
		<sourceDirectory>src</sourceDirectory>
		<testSourceDirectory>test</testSourceDirectory>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.3</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<version>2.3</version>
				<configuration>
					<archive>
						<manifest>
							<addClasspath>true</addClasspath>
							<mainClass>jp.ne.hatena.matasaburou.main.Main</mainClass>
						</manifest>
					</archive>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>org.mockito</groupId>
			<artifactId>mockito-core</artifactId>
			<version>2.0.42-beta</version>
		</dependency>
		<dependency>
			<groupId>dbunit</groupId>
			<artifactId>dbunit</artifactId>
			<version>2.2</version>
		</dependency>
		<dependency>
			<groupId>commons-dbutils</groupId>
			<artifactId>commons-dbutils</artifactId>
			<version>1.6</version>
		</dependency>
		<dependency>
			<groupId>org.hamcrest</groupId>
			<artifactId>hamcrest-all</artifactId>
			<version>1.3</version>
		</dependency>
		<dependency>
			<groupId>org.mariadb.jdbc</groupId>
			<artifactId>mariadb-java-client</artifactId>
			<version>1.3.5</version>
		</dependency>
	</dependencies>
</project>