My Account Log in

1 option

The well-grounded Java developer / Benjamin J. Evans, Jason Clark, and Martijn Verburg.

O'Reilly Online Learning: Academic/Public Library Edition Available online

View online
Format:
Book
Author/Creator:
Evans, Benjamin J., author.
Verburg, Martijn, author.
Clark, Jason D., author.
Series:
ITpro collection
Language:
English
Subjects (All):
Java (Computer program language).
Application software--Development.
Application software.
Java virtual machine.
Physical Description:
1 online resource (682 pages)
Edition:
Second edition.
Place of Publication:
Shelter Island, New York : Manning Publications Co., [2022]
Summary:
The Well-Grounded Java Developer, Second Edition introduces both the modern innovations and timeless fundamentals you need to know to become a Java master. Authors Ben Evans, Martijn Verburg, and Jason Clark distill their decades of experience as Java Champions, veteran developers, and key contributors to the Java ecosystem into this clear and practical guide. You'll discover how Java works under the hood and learn design secrets from Java's long history. Each concept is illustrated with hands-on examples, including a fully modularized application/library and creating your own multithreaded application. Java is the beating heart of enterprise software engineering. Developers who really know Java can expect easy job hunting and interesting work. Written by experts with years of boots-on-the-ground experience, this book upgrades your Java skills. It dives into powerful features like modules and concurrency models and even reveals some of Java's deep secrets. With The Well-Grounded Java Developer, Second Edition you will go beyond feature descriptions and learn how Java operates at the bytecode level. Master high-value techniques for concurrency and performance optimization, along with must-know practices for build, test, and deployment. You'll even look at alternate JVM languages like Kotlin and Clojure. Digest this book and stand out from the pack.
Contents:
Intro
The Well-Grounded Java Developer
Copyright
Praise for the First Edition
brief contents
contents
front matter
foreword
preface
acknowledgements
From Jason
From Martijn
From Ben
about this book
Who should read this book?
How to use this book
About the code
liveBook Discussion Forum
Other online resources
about the authors
about the cover illustration
Part 1. From 8 to 11 and beyond!
1 Introducing modern Java
1.1 The language and the platform
1.2 The new Java release model
1.3 Enhanced type inference (var keyword)
1.4 Changing the language and the platform
1.4.1 Sprinkling some sugar
1.4.2 Changing the language
1.4.3 JSRs and JEPs
1.4.4 Incubating and preview features
1.5 Small changes in Java 11
1.5.1 Collections factories (JEP 213)
1.5.2 Remove enterprise modules (JEP 320)
1.5.3 HTTP/2 (Java 11)
1.5.4 Single-file source-code programs (JEP 330)
Summary
2 Java modules
2.1 Setting the scene
2.1.1 Project Jigsaw
2.1.2 The module graph
2.1.3 Protecting the internals
2.1.4 New access control semantics
2.2 Basic modules syntax
2.2.1 Exporting and requiring
2.2.2 Transitivity
2.3 Loading modules
2.3.1 Platform modules
2.3.2 Application modules
2.3.3 Automatic modules
2.3.4 Unnamed module
2.4 Building a first modular app
2.4.1 Command-line switches for modules
2.4.2 Executing a modular app
2.4.3 Modules and reflection
2.5 Architecting for modules
2.5.1 Split packages
2.5.2 Java 8 Compact Profiles
2.5.3 Multi-release JARs
2.6 Beyond modules
3 Java 17
3.1 Text Blocks
3.2 Switch Expressions
3.3 Records
3.3.1 Nominal typing
3.3.2 Compact record constructors
3.4 Sealed Types
3.5 New form of instanceof
3.6 Pattern Matching and preview features.
Summary
Part 2. Under the hood
4 Class files and bytecode
4.1 Class loading and class objects
4.1.1 Loading and linking
4.1.2 Class objects
4.2 Class loaders
4.2.1 Custom class loading
4.2.2 Modules and class loading
4.3 Examining class files
4.3.1 Introducing javap
4.3.2 Internal form for method signatures
4.3.3 The constant pool
4.4 Bytecode
4.4.1 Disassembling a class
4.4.2 The runtime environment
4.4.3 Introduction to opcodes
4.4.4 Load and store opcodes
4.4.5 Arithmetic opcodes
4.4.6 Execution flow control opcodes
4.4.7 Invocation opcodes
4.4.8 Platform operation opcodes
4.4.9 Shortcut opcode forms
4.5 Reflection
4.5.1 Introducing reflection
4.5.2 Combining class loading and reflection
4.5.3 Problems with reflection
5 Java concurrency fundamentals
5.1 Concurrency theory primer
5.1.1 But I already know about Thread
5.1.2 Hardware
5.1.3 Amdahl's law
5.1.4 Explaining Java's threading model
5.1.5 Lessons learned
5.2 Design concepts
5.2.1 Safety and concurrent type safety
5.2.2 Liveness
5.2.3 Performance
5.2.4 Reusability
5.2.5 How and why do the forces conflict?
5.2.6 Sources of overhead
5.3 Block-structured concurrency (pre-Java 5)
5.3.1 Synchronization and locks
5.3.2 The state model for a thread
5.3.3 Fully synchronized objects
5.3.4 Deadlocks
5.3.5 Why synchronized?
5.3.6 The volatile keyword
5.3.7 Thread states and methods
5.3.8 Immutability
5.4 The Java Memory Model (JMM)
5.5 Understanding concurrency through bytecode
5.5.1 Lost Update
5.5.2 Synchronization in bytecode
5.5.3 Synchronized methods
5.5.4 Unsynchronized reads
5.5.5 Deadlock revisited
5.5.6 Deadlock resolved, revisited
5.5.7 Volatile access
6 JDK concurrency libraries.
6.1 Building blocks for modern concurrent applications
6.2 Atomic classes
6.3 Lock classes
6.3.1 Condition objects
6.4 CountDownLatch
6.5 ConcurrentHashMap
6.5.1 Understanding a simplified HashMap
6.5.2 Limitations of Dictionary
6.5.3 Approaches to a concurrent Dictionary
6.5.4 Using ConcurrentHashMap
6.6 CopyOnWriteArrayList
6.7 Blocking queues
6.7.1 Using BlockingQueue APIs
6.7.2 Using WorkUnit
6.8 Futures
6.8.1 CompletableFuture
6.9 Tasks and execution
6.9.1 Modeling tasks
6.9.2 Executors
6.9.3 Single-threaded executor
6.9.4 Fixed-thread pool
6.9.5 Cached thread pool
6.9.6 ScheduledThreadPoolExecutor
7 Understanding Java performance
7.1 Performance terminology: Some basic definitions
7.1.1 Latency
7.1.2 Throughput
7.1.3 Utilization
7.1.4 Efficiency
7.1.5 Capacity
7.1.6 Scalability
7.1.7 Degradation
7.2 A pragmatic approach to performance analysis
7.2.1 Know what you're measuring
7.2.2 Know how to take measurements
7.2.3 Know what your performance goals are
7.2.4 Know when to stop
7.2.5 Know the cost of achieving higher performance
7.2.6 Know the dangers of premature optimization
7.3 What went wrong? Why do we have to care?
7.3.1 Moore's law
7.3.2 Understanding the memory latency hierarchy
7.4 Why is Java performance tuning hard?
7.4.1 The role of time in performance tuning
7.4.2 Understanding cache misses
7.5 Garbage collection
7.5.1 Basics
7.5.2 Mark and sweep
7.5.3 Areas of memory
7.5.4 Young collections
7.5.5 Full collections
7.5.6 Safepoints
7.5.7 G1: Java's default collector
7.5.8 The Parallel collector
7.5.9 GC configuration parameters
7.6 JIT compilation with HotSpot
7.6.1 Why have dynamic compilation?
7.6.2 Introduction to HotSpot
7.6.3 Inlining methods.
7.6.4 Dynamic compilation and monomorphic calls
7.6.5 Reading the compilation logs
7.6.6 Deoptimization
7.7 JDK Flight Recorder
7.7.1 Flight Recorder
7.7.2 Mission Control
Part 3. Non-Java languages on the JVM
8 Alternative JVM languages
8.1 Language zoology
8.1.1 Interpreted vs. compiled languages
8.1.2 Dynamic vs. static typing
8.1.3 Imperative vs. functional languages
8.1.4 Reimplementation vs. original
8.2 Polyglot programming on the JVM
8.2.1 Why use a non-Java language?
8.2.2 Up-and-coming languages
8.2.3 Languages we could have picked but didn't
8.3 How to choose a non-Java language for your project
8.3.1 Is the project area low-risk?
8.3.2 Does the language interoperate well with Java?
8.3.3 Is there good tooling and test support for the language?
8.3.4 How hard is the language to learn?
8.3.5 Are there lots of developers using this language?
8.4 How the JVM supports alternative languages
8.4.1 Performance
8.4.2 Runtime environments for non-Java languages
8.4.3 Compiler fictions
9 Kotlin
9.1 Why use Kotlin?
9.1.1 Installing
9.2 Convenience and conciseness
9.2.1 Starting with less
9.2.2 Variables
9.2.3 Equality
9.2.4 Functions
9.2.5 Collections
9.2.6 Express yourself
9.3 A different view of classes and objects
9.3.1 Data classes
9.4 Safety
9.4.1 Null safety
9.4.2 Smart casting
9.5 Concurrency
9.6 Java interoperability
10 Clojure: A different view of programming
10.1 Introducing Clojure
10.1.1 Hello World in Clojure
10.1.2 Getting started with the REPL
10.1.3 Making a mistake
10.1.4 Learning to love the brackets
10.2 Looking for Clojure: Syntax and semantics
10.2.1 Special forms bootcamp
10.2.2 Lists, vectors, maps, and sets.
10.2.3 Arithmetic, equality, and other operations
10.2.4 Working with functions in Clojure
10.2.5 Loops in Clojure
10.2.6 Reader macros and dispatch
10.3 Functional programming and closures
10.4 Introducing Clojure sequences
10.4.1 Sequences and variable-arity functions
10.5 Interoperating between Clojure and Java
10.5.1 Calling Java from Clojure
10.5.2 The nature of Clojure calls
10.5.3 The Java type of Clojure values
10.5.4 Using Clojure proxies
10.5.5 Exploratory programming with the REPL
10.5.6 Using Clojure from Java
10.6 Macros
Part 4. Build and deployment
11 Building with Gradle and Maven
11.1 Why build tools matter for a well-grounded developer
11.1.1 Automating tedious operations
11.1.2 Managing dependencies
11.1.3 Ensuring consistency between developers
11.2 Maven
11.2.1 The build lifecycle
11.2.2 Commands/POM intro
11.2.3 Building
11.2.4 Controlling the manifest
11.2.5 Adding another language
11.2.6 Testing
11.2.7 Dependency management
11.2.8 Reviewing
11.2.9 Moving beyond Java 8
11.2.10 Multirelease JARs in Maven
11.2.11 Maven and modules
11.2.12 Authoring Maven plugins
11.3 Gradle
11.3.1 Installing Gradle
11.3.2 Tasks
11.3.3 What's in a script?
11.3.4 Using plugins
11.3.5 Building
11.3.6 Work avoidance
11.3.7 Dependencies in Gradle
11.3.8 Adding Kotlin
11.3.9 Testing
11.3.10 Automating static analysis
11.3.11 Moving beyond Java 8
11.3.12 Using Gradle with modules
11.3.13 Customizing
12 Running Java in containers
12.1 Why containers matter for a well-grounded developer
12.1.1 Host operating systems vs. virtual machines vs. containers
12.1.2 Benefits of containers
12.1.3 Drawbacks of containers
12.2 Docker fundamentals
12.2.1 Building Docker images.
12.2.2 Running Docker containers.
Notes:
Includes index.
Description based on print version record.
Includes bibliographical references and index.
ISBN:
9781638355281
1638355282
9781617298875
1617298875
OCLC:
1351747300
Publisher Number:
9781617298875AU

The Penn Libraries is committed to describing library materials using current, accurate, and responsible language. If you discover outdated or inaccurate language, please fill out this feedback form to report it and suggest alternative language.

Find

Home Release notes

My Account

Shelf Request an item Bookmarks Fines and fees Settings

Guides

Using the Find catalog Using Articles+ Using your account