diff --git a/core/modules/automated_cron/automated_cron.services.yml b/core/modules/automated_cron/automated_cron.services.yml
index 6bc3c00..013b9df 100644
--- a/core/modules/automated_cron/automated_cron.services.yml
+++ b/core/modules/automated_cron/automated_cron.services.yml
@@ -1,6 +1,6 @@
 services:
   automated_cron.subscriber:
     class: Drupal\automated_cron\EventSubscriber\AutomatedCron
-    arguments: ['@cron', '@config.factory', '@state']
+    arguments: ['@config.factory', '@state', '@lock.persistent', '@http_client']
     tags:
       - { name: event_subscriber }
diff --git a/core/modules/automated_cron/src/EventSubscriber/AutomatedCron.php b/core/modules/automated_cron/src/EventSubscriber/AutomatedCron.php
index b6aefcd..6eed009 100644
--- a/core/modules/automated_cron/src/EventSubscriber/AutomatedCron.php
+++ b/core/modules/automated_cron/src/EventSubscriber/AutomatedCron.php
@@ -3,8 +3,10 @@
 namespace Drupal\automated_cron\EventSubscriber;
 
 use Drupal\Core\Config\ConfigFactoryInterface;
-use Drupal\Core\CronInterface;
+use Drupal\Core\Lock\LockBackendInterface;
 use Drupal\Core\State\StateInterface;
+use Drupal\Core\Url;
+use GuzzleHttp\ClientInterface;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Symfony\Component\HttpKernel\Event\PostResponseEvent;
 use Symfony\Component\HttpKernel\KernelEvents;
@@ -15,13 +17,6 @@
 class AutomatedCron implements EventSubscriberInterface {
 
   /**
-   * The cron service.
-   *
-   * @var \Drupal\Core\CronInterface
-   */
-  protected $cron;
-
-  /**
    * The cron configuration.
    *
    * @var \Drupal\Core\Config\Config
@@ -36,19 +31,36 @@ class AutomatedCron implements EventSubscriberInterface {
   protected $state;
 
   /**
+   * The database lock object.
+   *
+   * @var \Drupal\Core\Lock\LockBackendInterface
+   */
+  protected $lock;
+
+  /**
+   * The HTTP client.
+   *
+   * @var \GuzzleHttp\ClientInterface
+   */
+  protected $httpClient;
+
+  /**
    * Constructs a new automated cron runner.
    *
-   * @param \Drupal\Core\CronInterface $cron
-   *   The cron service.
    * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
    *   The config factory.
    * @param \Drupal\Core\State\StateInterface $state
    *   The state key-value store service.
+   * @param \Drupal\Core\Lock\LockBackendInterface $lock
+   *   The persistent lock backend.
+   * @param \GuzzleHttp\ClientInterface $http_client
+   *   The HTTP Client.
    */
-  public function __construct(CronInterface $cron, ConfigFactoryInterface $config_factory, StateInterface $state) {
-    $this->cron = $cron;
+  public function __construct(ConfigFactoryInterface $config_factory, StateInterface $state, LockBackendInterface $lock, ClientInterface $http_client) {
     $this->config = $config_factory->get('automated_cron.settings');
     $this->state = $state;
+    $this->lock = $lock;
+    $this->httpClient = $http_client;
   }
 
   /**
@@ -62,7 +74,25 @@ public function onTerminate(PostResponseEvent $event) {
     if ($interval > 0) {
       $cron_next = $this->state->get('system.cron_last', 0) + $interval;
       if ((int) $event->getRequest()->server->get('REQUEST_TIME') > $cron_next) {
-        $this->cron->run();
+        // Only execute the request if we can acquire the persistent lock. If
+        // this fails then another request is already taking care of it and we
+        // don't have to retry.
+        if ($this->lock->acquire('cron_request')) {
+          // Execute the asynchronous request. This will return a
+          // \GuzzleHttp\Promise\PromiseInterface object, which can be either
+          // fulfilled or rejected.
+          $url = Url::fromRoute('system.cron', ['key' => $this->state->get('system.cron_key')], ['absolute' => TRUE])->toString();
+          $promise = $this->httpClient->requestAsync('GET', $url);
+
+          // Since the lock is persistent between requests, we have to release
+          // it no matter if the promise is fulfilled (cron succeeded) or
+          // rejected (cron failed), otherwise we will never be able to acquire
+          // it again in the future.
+          $promise->then(
+            function () { $this->lock->release('cron_request'); },
+            function () { $this->lock->release('cron_request'); }
+          );
+        }
       }
     }
   }
