タグ

Javaに関するhikazohのブックマーク (163)

  • ReadWriteLockのサンプル - きしだのHatena

    では、ReadWriteLockのサンプル。 読み込みスレッドは互いにロックせず、書き込みスレッドは他のスレッドとは同時に動かせない、というロックです。 サンプルでは、「か電車」が書き込みスレッド、「電車」が読み込みスレッドです。「か電車」が動くときには他のスレッドは動けません。 ReadWriteLockの実装としては、再入可能なReentrantReadWriteLockが用意されているので、これを使います。 ReadWriteLock lock = new ReentrantReadWriteLock(); 実際にロックするときは、ReadWriteLockオブジェクトからwriteLock/readLockメソッドで書き込み用ロックか読み込み用ロックを取得します。 Lock reallock = writer ? lock.writeLock() : lock.readLock()

    ReadWriteLockのサンプル - きしだのHatena
  • Java Tips: かしこいロック

    単純なロックの問題点 Java にはマルチスレッドプログラミングにおける一般的な排他制御を記述するのに適した synchronized ブロック、synchronized メソッドという構文があり、保護したいデータにアクセスする全てのコードをこれらの構文を使って同期化すれば、排他制御は簡単に実現できる。しかし、この方法には問題もある。例えば電子掲示板システムのログデータにこの方法を適用することを考えてみよう。 電子掲示板に対するアクセスを全て同期化するということは、一度に一人のユーザしかログにアクセスできないということである。なんらかの理由(サーバ・クライアント間の回線速度やクライアントの処理速度の低下など)でログの読み込みに時間がかかっているユーザが一人れば、サーバ側の計算機資源にいくら余裕があっても、その間は他の大勢のユーザは掲示板にアクセスできない。すなわち計算機資源の利用効率が著し

  • 日本語でのJavaDocの書き方 - 水まんじゅう2

    JavaDocを何で書くの?とか、書き方とかをまとめたページはたくさんありますが、日語特有の情報が抜け落ちていたり、英語でのJavaDocの書き方を説明するものばかりなので、日語特有の情報をいくつか書きたいと思います。 なお、JDK 8u144あたりでの挙動です。将来では変わるかもしれません。 JavaDocの書き方の一般的なものを知りたい場合は公式のマニュアルを見るのが一番良いと思います。 https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/javadoc.html サマリー文の後は2つ改行を入れましょう。 /** * 一行目はサマリー文としてその処理(クラス、メソッド等)の概要として扱われます。 * * <p>英語では行末に「.」(ピリオド)が入り、JavaDocではピリオドまでを1行目のサマリーとして扱

    日本語でのJavaDocの書き方 - 水まんじゅう2
  • Java 9のモジュール機能「Project Jigsaw」の基本を紹介

    はじめに モジュール機能はJava 9にとって最も大きな変更といえます。コードだけを見ると、ほんのわずかな違いに思えますが、その意味を知れば知るほど、この変更によるJava自身の変化の大きさに気づくのではないかと思います。 また、このモジュール機能は、機能の追加というよりもポリシー自体の変更と表現したほうが適切でしょう。それは、既存の環境だけではなく新しい環境に対して必要なことであり、Javaの用途がさらに広がったことを意味するのではないかと思います。 対象読者 Java関連に携わる開発者 これからJavaを学ぼうと思っている方 モジュール機能「Project Jigsaw」とは(1) Javaでこれまでモジュールといえばパッケージの概念と同じでした。しかしJava 9ではパッケージとは別に、モジュールという新たな概念が追加されています。 Javaのクラスやメソッド、そしてフィールドなどに

    Java 9のモジュール機能「Project Jigsaw」の基本を紹介
  • 知らなくても困らない Javaクラスのバイトコードの読み方 - A Memorandum

    クラスファイルの中身 クラスファイルの構造 javap コマンド javap 出力の概要 型とメソッドの読み方 オペランドスタック コンストラクタの実行 加算メソッド invoke 系命令 条件判断 for ループ まとめ 普段使いでは困ることはないですが、昨今はバイトコードマニピュレーションによる黒魔術が謳歌しているため、知っていると役に立つ場合もあるバイトコードの最低限の読み方を説明します。 クラスファイルの中身 以下のような簡単なソースコードを考えましょう。 public class Class1 { public int add(int x, int y) { return x + y; } } このソースコードをコンパイルして作成された Class1.class の中身のダンプを見てみます。 $ hexdump -C Class1.class 00000000 ca fe ba

    知らなくても困らない Javaクラスのバイトコードの読み方 - A Memorandum
    hikazoh
    hikazoh 2017/11/04
  • Java8 Stream の裏舞台は、きっとあなたが考えているより忙しない - A Memorandum

    Java9 も出た昨今でいまさらですが、Stream パイプラインが裏でどのように動いているのかをコードを交えて紹介します。 以下の単純な例を元に、内部処理を追っていきましょう。 Arrays.asList("a", "b", "c") .stream() // (1) Stream の生成 .filter(String::isEmpty) // (2) パイプライン .forEach(System.out::print); // (3) 終端処理 (1) Stream の生成 (2) パイプライン (3) 終端処理 まとめ (1) Stream の生成 最初はストリームを取得する stream() の中身から見ていきます。 stream() は Collection インターフェースのデフォルトメソッドとして以下のように定義されています。 public interface Collect

    Java8 Stream の裏舞台は、きっとあなたが考えているより忙しない - A Memorandum
  • 久しぶりのJAXB - マイペースなプログラミング日記

    MIDIのノート情報を独自形式で保存したり読み込んだり出来るようにしようと思いJAXBを使ってみることにした。 参考: JAXB With KotlinTech Garage こんな感じでクラスを作り… enum class MidiNoteType{ ON, OFF } @XmlAccessorType(XmlAccessType.FIELD) class MidiNote(@XmlAttribute var type: MidiNoteType, @XmlElement var number: Int, @XmlElement var position: Int){ constructor() : this(MidiNoteType.ON, -1, -1) } @XmlRootElement(name="notes") class MidiNoteList(){ @XmlElem

    久しぶりのJAXB - マイペースなプログラミング日記
  • 「SMTPサーバをたてといたから、メール送るプログラム作って」って言われたときのやりかた - そこに仁義はあるのか(仮)

    メモだよ やったこと 1. ✏️ SMTPサーバの情報を調べる 2. ✏️ spring-bootでメールを送る おまけ. ✏️ 相手に送信できたかどうか調べるには おまけのおまけ. ✏️ AWS SESとバウンス率 1. ✏️ SMTPサーバの情報を調べる まずは、サーバにたてたと言われたSMTPサーバの情報を調べます netstatで、smtpのポートとかを調べる これで、ポートとかがわかる # netstat -ap | grep "LISTEN " tcp 0 0 localhost:smtp *:* LISTEN 1316/master # netstat -anp | grep "LISTEN " tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1316/master 2. ✏️ spring-bootでメールを送る こんな感じで簡単にかけた Mai

    「SMTPサーバをたてといたから、メール送るプログラム作って」って言われたときのやりかた - そこに仁義はあるのか(仮)
  • Java SE 9の実験的API、HTTP/2 ClientでHTTP/2の高速化手法を知る

    前回まで、Java SE 9の実験的API「HTTP/2 Client」について、HTTP/1.1の範囲の機能を紹介してきました。しかしその名称の通り、最も重要な機能と言えるのがHTTP/2のサポートです。今回はHTTP/2に特有の機能を紹介していきます。 まず、HTTP/2について簡単に触れ、その後にHTTP/2 ClientにおけるHTTP/2関連の機能を紹介します。 HTTP/2とは HTTP/2はHTTPの高速化を目的としたプロトコルです。IETFによって2015年2月に承認されました。HTTP/1.1の策定が1997年ですから、18年ぶりのバージョンアップです。 HTTP/2はもともと米Googleが提唱していた「SPDY」をベースに策定されました。Googleは2016年にSPDYのサポートを終了し、現在はHTTP/2に置き換えています。 HTTP/2では以下のような高速化技術

    Java SE 9の実験的API、HTTP/2 ClientでHTTP/2の高速化手法を知る
  • Efficient data transfer through zero copy

    IBM Developer is your one-stop location for getting hands-on training and learning in-demand skills on relevant technologies such as generative AI, data science, AI, and open source.

    Efficient data transfer through zero copy
  • Java によるいろいろなカンマ区切り変換(または OpenJDKで提供されるJMH を利用したマイクロベンチマーク測定のやり方) - A Memorandum

    文字列結合 StringBuilder StringBuilder 簡略版 commons.lang StringUtils Guava Joiner Java8 String Collectors joining StringJoiner collect with StringJoiner JMH ベンチマーク測定ツール Gradle ビルドスクリプトの作成 ベンチマーク用ソースの作成 ベンチマークの実行 JMH オプション JMH オプションの補足説明 fork iterations threads batchSize operationsPerInvocation アノテーション @Param アノテーション @State アノテーション メソッドチェーン コマンドラインオプション List<String> list = Arrays.asList("A", "B", "C", "D

    Java によるいろいろなカンマ区切り変換(または OpenJDKで提供されるJMH を利用したマイクロベンチマーク測定のやり方) - A Memorandum
    hikazoh
    hikazoh 2017/07/29
  • System.nanoTime() をJMockitで乗っ取る - たごもりすメモ

    Javaでミドルウェアなど書いていると必然的に内部でタイマーを作ったりすることになってその制御に System.nanoTime() とかを使うことになると思うんだけど、じゃあテストどうしよっかと思うと、テストでは、まあ好きなタイミングで時間を進めたり好きなところで時間を止めたりってことが普通したいじゃないですか。どうすんのという話。 JMockitを使う とりあえずJMockitを使っとけという話っぽい。static methodをモックできるのはこれしかない*1。 JMockitは理想的なモックフレームワーク - じゅんいち☆かとうの技術日誌 ちょいちょい調べると例が見付かるので真似る。 import org.junit.Test; import static org.hamcrest.Matchers.is; import static org.junit.Assert.*; imp

    System.nanoTime() をJMockitで乗っ取る - たごもりすメモ
  • Java Memory Managementを読んだ - ymizushi のブログ

    概要 Java memory management | Dynatrace を読んだのでまとめました。 Java Memory Management How Garbage Collection Really Works ガベージコレクションという言葉から、ゴミ集めをする実装だと思いがちだが実はそうではないよ ガベージコレクタが管理しているのは、GCルートから参照されているオブジェクトで、参照されていないオブジェクトをゴミとみなすということだよ。イメージされるゴミ集めの実装を反対にした感じ。 OSでのグローバルな同期が必要ないから、個々のオブジェクトの作成は速いよ JVMが確保したヒープのメモリアレイのオフセット変えるだけだし、次のメモリ確保もオフセットをずらすだけでよいからね JVMは一旦確保したメモリを削除したもしないし、OSから確保したリソースをOSに返したりもしないよ Garbag

    Java Memory Managementを読んだ - ymizushi のブログ
    hikazoh
    hikazoh 2017/07/23
  • Java で -server オプションを付けたら4割近くも速くなったメモ - 全力で怠けたい

    Java で -server オプションを付けたら4割近くも速くなったときのメモ。 動機 ログファイル中の XML をパースして XPath で抜き出す調査用のツールを使っていたのですが、番機 / ステージング機と開発機で実行速度に大きな差がありました。番機・ステージング機・開発機はハードウェアのスペックからしてまったく違うとはいえ、同じログファイルに対して実行したときの TAT が2倍以上違うとかもザラにあり、少し調べてみました。 環境 番機・ステージング機: 64bit Windows 開発機: 32bit Windows 開発機では Client VM が使われていた 開発機の OS が 32bit Windows のため、デフォルトで Client VM が使われていたのが原因でした。java コマンドに -server オプションを指定して Server VM で実行するよ

    Java で -server オプションを付けたら4割近くも速くなったメモ - 全力で怠けたい
    hikazoh
    hikazoh 2017/07/23
  • コード最適化(高速化)の基礎 - カレーなる辛口Javaな加齢日記

    qiita「100万倍速いプログラムを書く」 http://qiita.com/Akai_Banana/items/48a35d2a40d1804d3b32 いまさらだけどホットエントリ経由. プログラミングを始めたばかりで高速化の大枠が全くわからず意味不明なことをしていた在学時、こんな資料があったら良かったのになあ、と思って書いたもの。 内容をまとめるとこんな感じ. id:vanbraam ここまでCPU-intensiveな処理が通常のプログラムでは殆どない.稿の言に従えば"律速段階"はそこじゃない事が多い;MathJax+math/tex->MathMLでこれだけの数式が書けるのを知る事ができたのは大きな収穫 id:kmaebashi 『つまり、Pythonはコードを一行ずつ機械語(010011011...)に変換(コンパイル)して動作します。』呪いのように何度も出てくる間違いだ…

    コード最適化(高速化)の基礎 - カレーなる辛口Javaな加齢日記
    hikazoh
    hikazoh 2017/07/19
  • 10年の長きに渡り Java の可変長引数を過信していた話 - A Memorandum

    可変長引数のループで ヌルポ発生 普通の呼び出し なんだ!? これ 念のため どうしても null を渡したい場合 まとめ 可変長引数のループで ヌルポ発生 先日とあるプロジェクトで、可変長引数を for - each している箇所でヌルポになっていた。 実際にはずっと複雑だが、簡単に書くと以下のような for ループでのヌルポ。 public void method(String... args) { for (String string : args) { // java.lang.NullPointerException // ... } } この10年 可変長引数が null を受け取るなんて。 可能性すら考えるまでもなく問題なしと思い込んでいた。 普通の呼び出し 普通に呼び出すと、 method(); method("hello"); method("hello", "world

    10年の長きに渡り Java の可変長引数を過信していた話 - A Memorandum
    hikazoh
    hikazoh 2017/06/23
  • Spring Boot で Web アプリを開発する環境の構築メモ - present

    Java で Web アプリを開発する場合、今なら Spring Boot が良さそう。早速、開発環境を構築してみた。 JDK のインストール Java SE Development Kit 8 - Downloads Spring Tool Suite のインストール IDE は IntelliJ IDEA。…と言いたいところだけど、先立つものが無いので、 Eclipse ベースの Spring Tool Suite(STS) をインストールした。 spring.io マシンにインストールしてある Java は 64bit 用なのに、32bit 用の STS をダウンロードしてしまい、無駄に嵌った。 Gradle のインストール ビルドツールは Gradle を使ってみたいので、Gradle をインストール。 Gradle Build Tool Binary-only の zip ファイ

    Spring Boot で Web アプリを開発する環境の構築メモ - present
  • JavaのテンプレートエンジンThymeleafチートシート

    「Thymeleaf」はJavaの代表的なテンプレートエンジンライブラリです。次の特徴があります。 Webサーバから受け取ったデータを埋め込んで表示できる 定義されたロジックをDOM上でXMLタグ・属性で指定。HTMLを静的に表示できる パースされたフィアルをキャッシュしてI/Oを最適化し、高速に表示 🐹 Thymeleafのデータ指定方法リンク/CSS/JS/画像パスの指定:@{...}リンク/CSS/JS/画像などのパスの記述するために@{...}の書き方があります。 <link rel="stylesheet" href="../../img/example.jpg" th:href="@{/img/example.jpg}" >

    JavaのテンプレートエンジンThymeleafチートシート
  • 2007-06-08

    サンタクロース問題をJavaで書いてみました(via サンタクロース問題を Squeak Smalltalk で)。Golfではありません。 …プログラムを書いてから問題を読み直したら、問題を読み違えてた(>_<)。こびとさんは10人いるのか。ふえーん。でもいいや、公開しちゃうもん。 import java.util.concurrent.*; import java.util.*; class Santa extends Thread { private static final int REINDEER_NUM = 9; private static final int ELF_NUM = 3; private boolean _readyAllElvesToWork = false; private boolean _readyAllReindeersToWork = false;

    2007-06-08
  • Java: サンタクロース問題 - lethevert is a programmer

    http://karetta.jp/article/blog/oneline/030756 これはJavaでも解いておかないとと思った。メモリ共有型マルチスレッドといったら、Javaだよね。 import java.util.*; public class Santa { static volatile boolean running = true; static ArrayList<Worker> forReindeer = new ArrayList<Worker>(9); static LinkedList<Worker> forElf = new LinkedList<Worker>(); static class Worker extends Thread { final List<Worker> queue; final String name; Worker (String

    Java: サンタクロース問題 - lethevert is a programmer