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).
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.