I found one valid example scenario explained by Realy Heavy Dude. Thanks.
I have designed a batch job for which only one instance is allowed to run at a time, all the others should be queued. You could achieve this by storing data about the running job somewhere, even in the database, but, what happens when the job crashes for some reason? The marker for the running job is not cleared, you would need to clear it manually. In this scenario I use a share lock. If the job gets an exclusive lock then I know that no other instance of the job is already running so I start it and downgrade the exclusive lock to a share lock which is held until the job goes out of scope. When another instance of the job tries to start it won't get the exclusive lock and will be queued. When the job that holds the share lock crashes, that share lock will automatically released by the database - so there's no need to manually clear anything.