diff --git a/src-tauri/src/core/handle.rs b/src-tauri/src/core/handle.rs
index bba93d04bfae2f8eb8bf3d30d88f36fdc6ae19c7..471790df00161ce3a874400bd93dcffb2bebbd77 100644
--- a/src-tauri/src/core/handle.rs
+++ b/src-tauri/src/core/handle.rs
@@ -10,8 +10,8 @@ pub struct Handle {
 }
 
 impl Handle {
-  pub fn from(app_handle: Option<AppHandle>) -> Handle {
-    Handle { app_handle }
+  pub fn set_inner(&mut self, app_handle: AppHandle) {
+    self.app_handle = Some(app_handle);
   }
 
   pub fn get_window(&self) -> Option<Window> {
diff --git a/src-tauri/src/core/mod.rs b/src-tauri/src/core/mod.rs
index df7d6d2f07a361b1a08e401b4381c26698b4d127..24421f6bf717ccf40bd674650c2fe2daddfedae2 100644
--- a/src-tauri/src/core/mod.rs
+++ b/src-tauri/src/core/mod.rs
@@ -22,7 +22,7 @@ static CORE: Lazy<Core> = Lazy::new(|| Core {
   sysopt: Arc::new(Mutex::new(Sysopt::new())),
   timer: Arc::new(Mutex::new(Timer::new())),
   runtime: Arc::new(Mutex::new(RuntimeResult::default())),
-  handle: Handle::default(),
+  handle: Arc::new(Mutex::new(Handle::default())),
 });
 
 #[derive(Clone)]
@@ -31,7 +31,7 @@ pub struct Core {
   pub sysopt: Arc<Mutex<Sysopt>>,
   pub timer: Arc<Mutex<Timer>>,
   pub runtime: Arc<Mutex<RuntimeResult>>,
-  pub handle: Handle,
+  pub handle: Arc<Mutex<Handle>>,
 }
 
 impl Core {
@@ -40,10 +40,14 @@ impl Core {
   }
 
   /// initialize the core state
-  pub fn init(&mut self, app_handle: tauri::AppHandle) {
+  pub fn init(&self, app_handle: tauri::AppHandle) {
     // kill old clash process
     Service::kill_old_clash();
-    self.handle = Handle::from(Some(app_handle));
+
+    {
+      let mut handle = self.handle.lock();
+      handle.set_inner(app_handle);
+    }
 
     {
       let mut service = self.service.lock();
@@ -58,8 +62,11 @@ impl Core {
       log_if_err!(sysopt.init_sysproxy());
     }
 
-    log_if_err!(self.handle.update_systray());
-    log_if_err!(self.handle.update_systray_clash());
+    {
+      let handle = self.handle.lock();
+      log_if_err!(handle.update_systray());
+      log_if_err!(handle.update_systray_clash());
+    }
 
     // timer initialize
     let mut timer = self.timer.lock();
@@ -124,7 +131,8 @@ impl Core {
     }
 
     if has_mode {
-      self.handle.update_systray_clash()?;
+      let handle = self.handle.lock();
+      handle.update_systray_clash()?;
     }
 
     Ok(())
@@ -186,7 +194,8 @@ impl Core {
     }
 
     if system_proxy.is_some() || tun_mode.is_some() {
-      self.handle.update_systray()?;
+      let handle = self.handle.lock();
+      handle.update_systray()?;
     }
 
     Ok(())
@@ -211,7 +220,8 @@ impl Core {
     });
 
     // update tray
-    self.handle.update_systray_clash()?;
+    let handle = self.handle.lock();
+    handle.update_systray_clash()?;
 
     Ok(())
   }
@@ -260,7 +270,10 @@ impl Core {
     let handle = self.handle.clone();
     tauri::async_runtime::spawn(async move {
       match Service::set_config(clash_info, config).await {
-        Ok(_) => handle.refresh_clash(),
+        Ok(_) => {
+          let handle = handle.lock();
+          handle.refresh_clash()
+        }
         Err(err) => log::error!(target: "app", "{err}"),
       }
     });
diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs
index 60426408475248112c55bdfe95609474ecf68e21..fd947c98480da86ad221ecc5b3c0201656dacb31 100644
--- a/src-tauri/src/utils/resolve.rs
+++ b/src-tauri/src/utils/resolve.rs
@@ -16,7 +16,7 @@ pub fn resolve_setup(app: &App) {
   }
 
   // core should be initialized after init_app fix #122
-  let mut core = Core::global();
+  let core = Core::global();
   core.init(app.app_handle());
 
   resolve_window(app);