The state itself would still be global so any criticism that applies to global state would still apply. The "restricted" access only hides what is essentially a global variable. A lock (I'm assuming you mean something like a binary semaphore.) only prevents race conditions (for example). That said, these are fine goals.
Is making them static and putting into an implementation file, leaving the only way to access them by functions with suitable locks, a good solution when the program needs something to be globally available ?
Well, again, global state and global variables are different.
Generally i am interested in this, I beleive the language provides for a well constructed program without any recourse to global variables in the traditional sense, if anyone can provide solid evidence for a general case to the contrary, I would like to see it.