Though PostgreSQL provides
nonblocking read/write access to table data, nonblocking
read/write access is not currently offered for every index access
method implemented in PostgreSQL. The various index types are
handled as follows:

B-tree and GiST
indexes

Short-term share/exclusive page-level locks are used for
read/write access. Locks are released immediately after
each index row is fetched or inserted. These index types
provide the highest concurrency without deadlock
conditions.

Hash indexes

Share/exclusive hash-bucket-level locks are used for
read/write access. Locks are released after the whole
bucket is processed. Bucket-level locks provide better
concurrency than index-level ones, but deadlock is possible
since the locks are held longer than one index
operation.

GIN indexes

Short-term share/exclusive page-level locks are used for
read/write access. Locks are released immediately after
each index row is fetched or inserted. But note that a
GIN-indexed value insertion usually produces several index
key insertions per row, so GIN might do substantial work
for a single value's insertion.

Currently, B-tree indexes offer the best performance for
concurrent applications; since they also have more features than
hash indexes, they are the recommended index type for concurrent
applications that need to index scalar data. When dealing with
non-scalar data, B-trees are not useful, and GiST or GIN indexes
should be used instead.