New experimental Threads.@spawn macro that runs a task on any available thread (#32600).
All system-level I/O operations (e.g. files and sockets) are now thread-safe. This does not include subtypes of IO that are entirely in-memory, such as IOBuffer, although it specifically does include BufferStream. (#32309, #32174, #31981, #32421).
The global random number generator (GLOBAL_RNG) is now thread-safe (and thread-local) (#32407).
New Channel(f::Function, spawn=true) keyword argument to schedule the created Task on any available thread, matching the behavior of Threads.@spawn (#32872).
Simplified the Channel constructor, which is now easier to read and more idiomatic julia. Use of the keyword arguments csize and ctype is now discouraged (#30855, #32818).
findfirst, findlast, findnext and findprev now accept a character as first argument to search for that character in a string passed as the second argument (#31664).
New findall(pattern, string) method where pattern is a string or regex (#31834).
count(pattern, string) gives the number of things findall would match (#32849).
istaskfailed is now documented and exported, like its siblings istaskdone and istaskstarted (#32300).
RefArray and RefValue objects now accept index CartesianIndex() in getindex and setindex! (#32653)
Added sincosd(x) to simultaneously compute the sine and cosine of x, where x is in degrees (#30134).
The function nonmissingtype, which removes Missing from type unions, is now exported (#31562).
Pkg won't clobber pre-compilation files as often when switching environments (#32651)
Pkg can now download and install binary artifacts through the Pkg.Artifacts submodule and supporting functions. (#32918)
When wait (or @sync, or fetch) is called on a failing Task, the exception is propagated as a TaskFailedException wrapping the task. This makes it possible to see the location of the original failure inside the task (as well as the location of the wait call, as before) (#32814).
Regex can now be multiplied (*) and exponentiated (^), like strings (#23422).
Cmd interpolation (`$(x::Cmd) a b c` where) now propagates x's process flags (environment, flags, working directory, etc) if x is the first interpolant and errors otherwise (#24353).
Zero-dimensional arrays are now consistently preserved in the return values of mathematical functions that operate on the array(s) as a whole (and are not explicitly broadcasted across their elements). Previously, the functions +, -, *, /, conj, real and imag returned the unwrapped element when operating over zero-dimensional arrays (#32122).
IPAddr subtypes now behave like scalars when used in broadcasting (#32133).
Pair is now treated as a scalar for broadcasting (#32209).
mod now accepts a unit range as the second argument to easily perform offset modular arithmetic to ensure the result is inside the range (#32628).
nothing can now be printed, and interpolated into strings etc. as the string "nothing". It is still not permitted to be interpolated into Cmds (i.e. $echo `$(nothing)`$ will still error without running anything.) (#32148)
When open is called with a function, command, and keyword argument (e.g. open(`ls`, read=true) do f ...) it now correctly throws a ProcessFailedException like other similar calls (#32193).
mktemp and mktempdir now try, by default, to remove temporary paths they create before the process exits (#32851).
The BLAS submodule no longer exports dot, which conflicts with that in LinearAlgebra (#31838).
diagm and spdiagm now accept optional m,n initial arguments to specify a size (#31654).
Hessenberg factorizations H now support efficient shifted solves (H+µI) \ b and determinants, and use a specialized tridiagonal factorization for Hermitian matrices. There is also a new UpperHessenberg matrix type (#31853).
Added keyword argument alg to svd and svd! that allows one to switch between different SVD algorithms (#31057).
Five-argument mul!(C, A, B, α, β) now implements inplace multiplication fused with addition C = A B α + C β (#23919).
SparseMatrixCSC(m,n,colptr,rowval,nzval) perform consistency checks for arguments: colptr must be properly populated and lengths of colptr, rowval, and nzval must be compatible with m, n, and eltype(colptr).
sparse(I, J, V, m, n) verifies lengths of I, J, V are equal and compatible with eltype(I) and m, n.
The ClangSA.jl static analysis package has been imported, which makes use of the clang static analyzer to validate GC invariants in Julia's C code. The analysis may be run using make -C src analyzegc.