The Condition type now has a thread-safe replacement, accessed as Threads.Condition. With that addition, task scheduling primitives such as ReentrantLock are now thread-safe (#30061).
It is possible to schedule and switch Tasks during @threads loops, and perform limited I/O (#31438).
The build system now prefers downloading prebuilt binary tarballs for most dependencies on supported systems, disable by setting USE_BINARYBUILDER=0 at make time (#31441).
getipaddrs() function returns all the IP addresses of the local machine, with IPv4 addresses sorting before IPv6 addresses ([#30349, #30604]).
getipaddr(addr_type) and getipaddrs(addr_type) functions returns an IP address(es) of the desired type of the local machine (#30604).
Added Base.hasproperty and Base.hasfield (#28850).
One argument !=(x), >(x), >=(x), <(x), <=(x) have been added, returning partially-applied versions of the functions, similar to the existing ==(x) and isequal(x) methods (#30915).
Enum now behaves like a scalar when used in broadcasting (#30670).
If a pipeline is specified with append=true set, but no redirection, an ArgumentError is thrown, rather than a ErrorException (#27900).
Functions that invoke commands (e.g. run(::Cmd)) now throw a ProcessFailedException rather than an ErrorException, if those commands exit with non-zero exit code (#27900).
The extrema function now accepts a function argument in the same manner as minimum and maximum (#30323).
hasmethod can now check for matching keyword argument names (#30712).
startswith and endswith now accept a Regex for the second argument (#29790).
A no-argument constructor for Ptr{T} has been added which constructs a null pointer (#30919).
strip now accepts a function argument in the same manner as lstrip and rstrip (#31211).
mktempdir now accepts a prefix keyword argument to customize the file name (#31230, #22922).
keytype and valtype now work on AbstractArray, and return the eltype of keys(...) and values(...) respectively (#27749).
nextfloat(::BigFloat) and prevfloat(::BigFloat) now returns a value with the same precision as their argument, which means that (in particular) nextfloat(prevfloat(x)) == x whereas previously this could result in a completely different value with a different precision (#31310).
mapreduce now accepts multiple iterators, similar to map (#31532).
filter now supports SkipMissing-wrapped arrays (#31235).
Objects created by calling skipmissing on an array can now be indexed using indices from the parent at non-missing positions. This allows functions such as findall, findfirst, argmin/argmax and findmin/findmax to work with these objects, returning the index of matching non-missing elements in the parent (#31008).
inv(::Missing) has now been added and returns missing (#31451).
nextfloat(::BigFloat, n::Integer) and prevfloat(::BigFloat, n::Integer) methods have been added (#31310).
Performance improvements for sparse matrix-matrix multiplication (#30372).
Sparse vector outer products are more performant and maintain sparsity in products of the form kron(u, v'), u * v', and u .* v' where u and v are sparse vectors or column views (#24980).
The sprand function is now 2 to 5 times faster (#30494). As a consequence of this change, the random stream of matrices produced with sprand and sprandn has changed.