Use separate lock in UserController

Introduced a new lock for synchronizing internal state - mLock.

This change improves locking by reducing the amount of contention on
ActivityManager lock. E.g. in user switching test executed 4 times, the
total time reported in dvm_lock_sample for locks owned by UserController
was reduced from 9200 to 2400 ms.

Test: UserControllerTest
Test: android.multiuser.UserLifecycleTests
Test: CtsMultiUserHostTestCases

Bug: 64165549
Change-Id: I907b22dcda806b4159c8afa4a7299e8e538ba721
diff --git a/services/core/java/com/android/server/am/UserState.java b/services/core/java/com/android/server/am/UserState.java
index 2e27387..d36d9cb 100644
--- a/services/core/java/com/android/server/am/UserState.java
+++ b/services/core/java/com/android/server/am/UserState.java
@@ -59,8 +59,10 @@
     /**
      * The last time that a provider was reported to usage stats as being brought to important
      * foreground procstate.
+     * <p><strong>Important: </strong>Only access this field when holding ActivityManagerService
+     * lock.
      */
-    public final ArrayMap<String,Long> mProviderLastReportedFg = new ArrayMap<>();
+    final ArrayMap<String,Long> mProviderLastReportedFg = new ArrayMap<>();
 
     public UserState(UserHandle handle) {
         mHandle = handle;