Javaスレッドで異なるインスタンスでも同期するためには
Javaでスレッドで同期するにはsynchronizedを使用するが、
synchronized public void foo() { .... }
や
public void foo() { synchronized (this) { .... } }
とした場合、同じインスタンスでの同期となる。
スレッドが異なるインスタンスを使用して同期しなきゃいけない時は、同期用オブジェクトをsynchronizedに指定してやれば良い。例ではクラス変数を参照して同期している。
package com.foobar.console; /** * スレッド同志で異なるインスタンスでも同期できるかのテスト */ public class Test00 { private static final int MAX_THREAD = 500; public static int counter = 0; public static final Object LOCK = new Object(); // 同期用オブジェクト public static void main(String[] args) { // スレッド生成 MyThread[] threads0 = new MyThread[MAX_THREAD]; MyThread[] threads1 = new MyThread[MAX_THREAD]; for (int i = 0; i < MAX_THREAD; i++) { threads0[i] = new MyThread(new Counter()); threads1[i] = new MyThread(new Counter()); threads0[i].start(); threads1[i].start(); } // スレッドが全て終了するのを待つ for (int i = 0; i < MAX_THREAD; i++) { try { threads0[i].join(); threads1[i].join(); } catch (InterruptedException e) { System.out.println(e); } } // カウンタを表示 System.out.println(counter); } } /** * スレッドクラス */ class MyThread extends Thread { private Counter counter = null; public MyThread(Counter counter) { this.counter = counter; } public void run() { this.counter.countUp(); } } /** * カウンタクラス */ class Counter { public void countUp() { synchronized (Test00.LOCK) { System.out.print("."); int n = Test00.counter; // カウンタ値を読み込み System.out.print("o"); Test00.counter = n + 1; // 加算してカウンタに設定 System.out.print("O"); } } }
参考にしたのは以下のサイト。
はてなブログに引っ越します
Windows8からWindows10にアップグレードしたらWSDプリンタが見えなくなって困った件
MacOS XのVMware上のWindows8からホスト側ネットワーク接続されたプリンタへの設定(WSD)で設定したプリンタがWindows10にしてから見えなくなっていた。原因不明。
とりあえず、上記URL通りにWSDでプリンタ追加をしようとしたら、
とエラーとなり追加できない。何度もやってみたけど同じ。
ググってみてもいい解決方法が見つからず、またCanonのサイトからドライバをダウンロードしてインストールをしようとしてみたけど、こちらはネットワーク(同じセグメントでないとダメ)もしくはUSB接続していないとインストールできない流れ。
諦めかけてたところでWindows Updateになったのでダウンロード、インストールして後、再度プリンタドライバを確認したところ、
なんと復活していた。
うーん、印刷できるけど、原因不明、気持ち良くない。
MacOSのfirefoxでgooglemapを見ると画面が乱れる件
OS | MacOS 10.7.5(Lion) |
---|---|
Software | firefox 44.0.2(現在最新) |
でgooglemapやPDF、javascriptで画像を入れ替えてたりすると画像が乱れるという現象に遭遇。firefoxがここ最近バージョンアップしてから(確証ないけど44になった辺りかと思うが)この現象に遭遇し、まったくもってgooglemapが見えないし気持ちも悪い。
いろいろ試してみて解決したのでログを残す。
肝心のGoogleMap
以下のように超キモい。GoogleMapにアクセスした最初は表示されるんだけど、きっとすべて読み込み完了後(jqueryでいえば$(document).ready()後のようなタイミング)にこんな感じになる。
Mapの値(value)の中身でソート
自身で作成したクラスのインスタンスの中身でソートさせたい場合おおよそ以下のようにする。
- Map.EntryセットをListに突っ込む。
- ListをCollectionを使ってソート。ここで自身で作成したクラスのインスタンスの値を使って比較する。
MyClass.java
$ cat MyClass.java public class MyClass { private String name; private String value; public MyClass(String n, String v) { this.name = n; this.value = v; } public void setName(String n) { this.name = n; } public String getName() { return name; } public void setValue(String v) { this.value = v; } public String getValue() { return value; } }
MySort.java
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; public class MySort { public static void main(String[] args) { // LinkedHashMap 生成 Map<String, MyClass> map = new LinkedHashMap<String, MyClass>(); map.put("a", new MyClass("aa", "0004")); map.put("b", new MyClass("bb", "0003")); map.put("c", new MyClass("cc", "0002")); map.put("d", new MyClass("dd", "0001")); // generate ArrayList for sorting List<Map.Entry<String,MyClass>> entries = new ArrayList<Map.Entry<String,MyClass>>(map.entrySet()); // find it out later Entry target = entries.get(2); // sort by value of MyClass using Collection Collections.sort(entries, new Comparator<Map.Entry<String,MyClass>>() { @Override public int compare( Entry<String,MyClass> entry1, Entry<String,MyClass> entry2) { return entry1.getValue().getValue().compareTo(entry2.getValue().getValue()); } }); // result for (Entry<String,MyClass> s : entries) { System.out.println("Key = " + s.getKey() + " [MyClassName = " + s.getValue().getName() + " MyClassValue = " + .getValue().getValue() + "]"); } System.out.println("index = " + entries.indexOf(target)); } }
確認
$ ls MyClass.java MySort.java $ javac MySort.java $ java MySort Key = d [MyClassName = dd MyClassValue = 0001] Key = c [MyClassName = cc MyClassValue = 0002] Key = b [MyClassName = bb MyClassValue = 0003] Key = a [MyClassName = aa MyClassValue = 0004] index = 1
参考にしたのは以下のサイト。
VMware FusionのUbuntu14.04にVMwareToolsをインストールしてみた件の続き
VMware FusionのUbuntu14.04にVMwareToolsをインストールしてみた件でid:ytooyamaさんからコメントをいただいた。
open-vm-toolsをいれたのであればVMware Toolsは入れる必要はありません。
open-vm-toolsはそれぞれのOSでパッケージ管理されており、アップデートが容易なためです。
混じっていると面倒なので一度入れ直したほうがいいかもしれません。
https://www.climb.co.jp/blog_vmware/vmware-6346
なるほど、そんなことになっていたんだ。
このご指摘にあったURLにアクセスして内容を確認。さらにそこに書いてあったURL
を見ると、
ドラッグ&ドロップしたければvmhgfsドライバをいれろ。
このドライバはOSになく、ドライバインストールは他のVMwareドライバやOpen VMware Toolsを邪魔しないから、
ドライバインストールは、
1. Open VMware Toolsを入れろ。
2. VMware(WorkstationまたはFution)についてくるTARボールを入れろ。
だ。
と書いている。
そうなら手順的には正しいのかもしれない(lsmodでみたらちゃんとvmhgfsがあったし)。でもせっかくなんで実験もかねてWVware Toolsを入れ直してみた。
TARでインストールしたVMware Toolsの削除
TARボールに含まれているbin/vm-uninstall-tools.plを実行。
kohchi@ubuntu13:~/$ zcat VMwareTools-10.0.1-3160059.tar.gz | tar xf - kohchi@ubuntu13:~/$ cd vmware-tools-distrib/bin kohchi@ubuntu13:~/vmware-tools-distrib/bin$ sudo ./vmware-uninstall-tools.pl [sudo] password for kohchi: Uninstalling the tar installation of VMware Tools. Stopping services for vmware-tools vmware-tools stop/waiting Stopping services for vmware-tools-thinprint vmware-tools-thinprint stop/waiting The removal of VMware Tools 10.0.1 build-3160059 for Linux completed successfully. Thank you for having tried this software. kohchi@ubuntu13:~/vmware-tools-distrib/bin$
open-vm-tools-desktopの削除
apt-getのremove(設定ファイルを削除したければpurge)を実行。
kohchi@ubuntu13:~/vmware-tools-distrib/bin$ sudo apt-get remove open-vm-tools-desktop パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 以下のパッケージが自動でインストールされましたが、もう必要とされていません: libmpdec2 libpostproc52 libupstart1 linux-headers-3.13.0-24 linux-headers-3.13.0-24-generic linux-image-3.13.0-24-generic linux-image-3.8.0-31-generic linux-image-extra-3.13.0-24-generic linux-image-extra-3.8.0-31-generic これを削除するには 'apt-get autoremove' を利用してください。 以下のパッケージは「削除」されます: open-vm-tools-desktop アップグレード: 0 個、新規インストール: 0 個、削除: 1 個、保留: 14 個。 この操作後に 447 kB のディスク容量が解放されます。 続行しますか? [Y/n] y (データベースを読み込んでいます ... 現在 290572 個のファイルとディレクトリがインストールされています。) open-vm-tools-desktop (2:9.4.0-1280544-5ubuntu6.2) を削除しています ... kohchi@ubuntu13:~/vmware-tools-distrib/bin$
open-vm-toolsの削除
open-vm-tools-desktopと同様。
kohchi@ubuntu13:~/vmware-tools-distrib/bin$ sudo apt-get remove open-vm-tools パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 以下のパッケージが自動でインストールされましたが、もう必要とされていません: libdumbnet1 libmpdec2 libpostproc52 libupstart1 linux-headers-3.13.0-24 linux-headers-3.13.0-24-generic linux-image-3.13.0-24-generic linux-image-3.8.0-31-generic linux-image-extra-3.13.0-24-generic linux-image-extra-3.8.0-31-generic zerofree これを削除するには 'apt-get autoremove' を利用してください。 以下のパッケージは「削除」されます: open-vm-tools アップグレード: 0 個、新規インストール: 0 個、削除: 1 個、保留: 14 個。 この操作後に 2,344 kB のディスク容量が解放されます。 続行しますか? [Y/n] y (データベースを読み込んでいます ... 現在 290564 個のファイルとディレクトリがインストールされています。) open-vm-tools (2:9.4.0-1280544-5ubuntu6.2) を削除しています ... * Stopping open-vm guest daemon vmtoolsd [ OK ] man-db (2.6.7.1-1ubuntu1) のトリガを処理しています ... libc-bin (2.19-0ubuntu6.6) のトリガを処理しています ... kohchi@ubuntu13:~/vmware-tools-distrib/bin$
open-vm-tools/open-vm-tools-desktopのインストール
apt-getのinstallを実行。
kohchi@ubuntu13:~$ sudo apt-get install open-vm-tools パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 以下のパッケージが自動でインストールされましたが、もう必要とされていません: libmpdec2 libpostproc52 libupstart1 linux-headers-3.13.0-24 linux-headers-3.13.0-24-generic linux-image-3.13.0-24-generic linux-image-3.8.0-31-generic linux-image-extra-3.13.0-24-generic linux-image-extra-3.8.0-31-generic これを削除するには 'apt-get autoremove' を利用してください。 提案パッケージ: open-vm-tools-desktop 以下のパッケージが新たにインストールされます: open-vm-tools アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 14 個。 456 kB のアーカイブを取得する必要があります。 この操作後に追加で 2,344 kB のディスク容量が消費されます。 取得:1 http://jp.archive.ubuntu.com/ubuntu/ trusty-updates/main open-vm-tools i386 2:9.4.0-1280544-5ubuntu6.2 [456 kB] 456 kB を 0秒 で取得しました (972 kB/s) 以前に未選択のパッケージ open-vm-tools を選択しています。 (データベースを読み込んでいます ... 現在 290499 個のファイルとディレクトリがインストールされています。) .../open-vm-tools_2%3a9.4.0-1280544-5ubuntu6.2_i386.deb を展開する準備をしています ... open-vm-tools (2:9.4.0-1280544-5ubuntu6.2) を展開しています... man-db (2.6.7.1-1ubuntu1) のトリガを処理しています ... ureadahead (0.100.0-16) のトリガを処理しています ... ureadahead will be reprofiled on next reboot open-vm-tools (2:9.4.0-1280544-5ubuntu6.2) を設定しています ... * Starting open-vm daemon vmtoolsd [ OK ] libc-bin (2.19-0ubuntu6.6) のトリガを処理しています ... kohchi@ubuntu13:~$ kohchi@ubuntu13:~$ sudo apt-get install open-vm-tools-desktop パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 以下のパッケージが自動でインストールされましたが、もう必要とされていません: libmpdec2 libpostproc52 libupstart1 linux-headers-3.13.0-24 linux-headers-3.13.0-24-generic linux-image-3.13.0-24-generic linux-image-3.8.0-31-generic linux-image-extra-3.13.0-24-generic linux-image-extra-3.8.0-31-generic これを削除するには 'apt-get autoremove' を利用してください。 以下のパッケージが新たにインストールされます: open-vm-tools-desktop アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 14 個。 120 kB のアーカイブを取得する必要があります。 この操作後に追加で 447 kB のディスク容量が消費されます。 取得:1 http://jp.archive.ubuntu.com/ubuntu/ trusty-updates/main open-vm-tools-desktop i386 2:9.4.0-1280544-5ubuntu6.2 [120 kB] 120 kB を 0秒 で取得しました (431 kB/s) 以前に未選択のパッケージ open-vm-tools-desktop を選択しています。 (データベースを読み込んでいます ... 現在 290565 個のファイルとディレクトリがインストールされています。) .../open-vm-tools-desktop_2%3a9.4.0-1280544-5ubuntu6.2_i386.deb を展開する準備をしています ... open-vm-tools-desktop (2:9.4.0-1280544-5ubuntu6.2) を展開しています... open-vm-tools-desktop (2:9.4.0-1280544-5ubuntu6.2) を設定しています ... kohchi@ubuntu13:~$ lsmod | grep vm vmw_balloon 13191 0 vmwgfx 149294 3 ttm 85079 1 vmwgfx drm 244037 4 ttm,vmwgfx vmw_vmci 60731 0 kohchi@ubuntu13:~$
結果
open-vm-tools/open-vm-tools-desktopで文字列のコピペはなんら問題がなかった。
ファイルのドラッグ&ドロップはvmhgfsがなくても最初失敗するが「再試行」するとできるという状態なんだけど、VMware-Toolsを入れていたときも同じ状態だったので入れ直しによって起きた問題でない。この調査は後回しとする。