Most people talk as if Locks & Latches do the same thing. They stating a Latch is a lightweight version of a Lock, which really doesn’t tell you much. I found it much simpler to understand if you view them as similar but completely different objects used for a completely different purpose. They aren't the same & one is not a subset of the other.
SQL is a multi-threaded, multi-user application.
As with all multi-threaded applications you need to ensure that the threads do not trip over each other. Mutexes, Latches and other approaches have been developed to perform the task of thread synchronisation. They are industry standard practices used in all Multi-threaded apps. For example if 1 thread is actually reading a page from disk & creating a memory structure to contain it, it will create 1 or more Latches (and perhaps other thread synisation objects) to prevent corruption of those structures. Once that operation is complete, the thread synchronisation objects (latches) will be released & the other threads will be able to access that page & memory structures again.
Thus latches are mostly very transient, taking a few millisecs to complete. Unless of course the piece of code/memory they need is already "Reserved / blocked" by some other thread. In which case the requesting thread is put to sleep while it waits for the spinlock/latch/mutex to be released.
On the other hand multi-user applications need a way to isolate user activity. a Lock is part of a user defined thing called a Transaction that prevents different users from overwriting each other’s changes. Generally a lock will last for the duration of the transaction (or in the case of shared locks, as long as is needed to ensure the transaction can be correctly rolled back.)
Of course the 2 have a high degree of correlation. When a user reads a page, transactional integrity will require a shared lock on the rows or pages touched & perhaps Intent Shared Locks on the Table & Page.
While the actual IO is happening latches will occur while memory buffers are being modified to contain & point to those pages retrieved. Unlike a Lock, Latches do not care about the transaction, they don’t get rolled back.
As more IO occurs, there is a greater probability that your thread will be blocked by a latch caused by IO requested by another thread. Hence the correlation between increased IO contention & increased latch activity.