What is the shared resource you are trying to obtain that might cause the clash? If it is the progress bar, than it can only be updated through the UI thread itself, all you need to do is use Invoke and InvokeRequired from your threads. see: Using InvokeRequired vs control.InvokeRequired
If you have any other shared resources, When using the lock , if done correct (no deadlocks etc...) the code will be thread safe, but that will come at a performance cost.
Finally, I would use tasks instead of threads see: How to update UI from child tasks in WinForms