トップページ > プログラム > 2020年03月25日 > S+BBkcDL

書き込み順位&時間帯一覧

3 位/132 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000022110000000000006



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
Java入門・初心者質問スレ Part.9

書き込みレス一覧

Java入門・初心者質問スレ Part.9
780 :デフォルトの名無しさん[sage]:2020/03/25(水) 08:15:14.54 ID:S+BBkcDL
Clip は、再生前に音声データを全部ロードしてから使うクラスで、
インスタンスを使い回さず、再生前に再生時間の取得とかが必要ないなら、
SourceDataLine を使ってリアルタイムにストリーム化した再生をしたほうが良い

「AudioInputStream がスレッドセーフじゃないっぽい」というのは本来はあまり関係なくて、それを使ってる Clip が実装内で同期化してるなら問題ない
質問者のコードは何故か毎回 open してるからあれだけど、Clipを使う場合、open時に受け渡すだけの AudioInputStream は、Clip の中以外で複数スレッドでは使わないでしょうし

Clip の API見たらスレッドセーフと明示されてるわけじゃなくて、本当は Clip の実装クラスが同期化してるかによるけど

>>778 の下の方のソースコードで問題ないと思う

細かいことをいえば、
Clip[] clips = {
create("C:\\Users\\a\\Desktop\\work\\decision1.wav"),
create("C:\\Users\\a\\Desktop\\work\\decision2.wav"),
create("C:\\Users\\a\\Desktop\\work\\decision3.wav")
};
この変数自体が同期化されてないとか

ロード、アンロード、ストリーム化した再生、同期化、複数同時再生とやってったコードあるけど、ここには書けない
Java入門・初心者質問スレ Part.9
781 :デフォルトの名無しさん[sage]:2020/03/25(水) 08:31:00.19 ID:S+BBkcDL
補足)
>>778 の下の方のソースコードで問題ないと思う
といったけど、再生終わる前に再生すると壊れるから、やっぱりちゃんと同期化は必要かな
Java入門・初心者質問スレ Part.9
784 :デフォルトの名無しさん[sage]:2020/03/25(水) 09:23:39.45 ID:S+BBkcDL
>>781
final でない変数を複数スレッドで使う場合は常に同期化が必要

> スレッドが起動するときに同期化は行われるはず
たしかに、実質的に final なら動作上は問題ない、だから「細かいこと」
でも、final にしてないなら作法上やっぱり同期化は必要(final Clip[] clips でもダメだからね)
自分だけが見て、自分だけが書くプログラムなら好きにすればいいよ
Java入門・初心者質問スレ Part.9
785 :デフォルトの名無しさん[sage]:2020/03/25(水) 09:33:23.96 ID:S+BBkcDL
>>783
ごめんね、やっぱり問題なかったわ…
再生中に再生しようとすると、無視されるだけだった
Java入門・初心者質問スレ Part.9
788 :デフォルトの名無しさん[sage]:2020/03/25(水) 10:35:06.66 ID:S+BBkcDL
>>787
> finalにするとコンストラクタの処理が完了した時点での可視性が保証されるってことでしょ
違う、そういう意味で final の場合は同期が必要ないって言ってるんじゃない
final にすると書き換えられないから、一度可視になればそのままの値であることがずっと保証されてる

一方、Clip[] clips の場合は final じゃないから、値が更新されたらその時点で同期が保証されない

作法としては、final じゃない、複数スレッドに渡って使用する変数は常に同期は必要
Java入門・初心者質問スレ Part.9
793 :デフォルトの名無しさん[sage]:2020/03/25(水) 11:15:56.14 ID:S+BBkcDL
>>792
> final Clip[] clips でもダメだからね
ってちゃんと書いてるからね


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。