diff --git a/core/lib/Drupal/Core/Lock/DatabaseLockBackend.php b/core/lib/Drupal/Core/Lock/DatabaseLockBackend.php
index d877dba..a62767e 100644
--- a/core/lib/Drupal/Core/Lock/DatabaseLockBackend.php
+++ b/core/lib/Drupal/Core/Lock/DatabaseLockBackend.php
@@ -103,6 +103,16 @@ class DatabaseLockBackend extends LockBackendAbstract {
   }
 
   /**
+   * Implements Drupal\Core\Lock\LockBackedInterface::forceRelease().
+   */
+  public function forceRelease($name) {
+    unset($this->locks[$name]);
+    db_delete('semaphore')
+      ->condition('name', $name)
+      ->execute();
+  }
+
+  /**
    * Implements Drupal\Core\Lock\LockBackedInterface::releaseAll().
    */
   public function releaseAll($lock_id = NULL) {
diff --git a/core/lib/Drupal/Core/Lock/LockBackendInterface.php b/core/lib/Drupal/Core/Lock/LockBackendInterface.php
index 01ca219..c3d143b 100644
--- a/core/lib/Drupal/Core/Lock/LockBackendInterface.php
+++ b/core/lib/Drupal/Core/Lock/LockBackendInterface.php
@@ -61,6 +61,16 @@
   public function release($name);
 
   /**
+   * Releases a lock acquired by another thread.
+   *
+   * This should only be used if the request that originally acquired the lock has
+   * died without releasing it, e.g. due to a server crash.
+   *
+   * @param string $name
+   */
+  public function forceRelease($name);
+
+  /**
    * Releases all locks for the given lock token identifier.
    *
    * @param string $lockId
diff --git a/core/lib/Drupal/Core/Lock/NullLockBackend.php b/core/lib/Drupal/Core/Lock/NullLockBackend.php
index bd59888..91afb85 100644
--- a/core/lib/Drupal/Core/Lock/NullLockBackend.php
+++ b/core/lib/Drupal/Core/Lock/NullLockBackend.php
@@ -47,6 +47,11 @@ class NullLockBackend implements LockBackendInterface {
   public function release($name) {}
 
   /**
+   * Implements Drupal\Core\Lock\LockBackedInterface::forceRelease().
+   */
+  public function forceRelease($name) {}
+
+  /**
    * Implements Drupal\Core\Lock\LockBackedInterface::releaseAll().
    */
   public function releaseAll($lock_id = NULL) {}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Lock/LockFunctionalTest.php b/core/modules/system/lib/Drupal/system/Tests/Lock/LockFunctionalTest.php
index 4683263..7747db9 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Lock/LockFunctionalTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Lock/LockFunctionalTest.php
@@ -106,6 +106,14 @@ class LockFunctionalTest extends WebTestBase {
     // We cannot renew it, since the other thread took it.
     $this->assertFalse(lock()->acquire('system_test_lock_acquire'), 'Lock cannot be extended by this request.', 'Lock');
 
+    // Force-release our lock from the other request.
+    $lock_acquired = 'TRUE: Lock successfully acquired in system_test_lock_force_release()';
+    $lock_not_acquired_exit = 'FALSE: Lock not acquired in system_test_lock_force_release()';
+    $this->assertTrue(lock()->acquire('system_test_lock_force_release'), t('Lock acquired by this request.'), t('Lock'));
+    $this->drupalGet('system-test/lock-force-release');
+    $this->assertText($lock_acquired, t('Lock acquired by the other request, force-breaking our lock.'), t('Lock'));
+    $this->assertFalse(lock()->acquire('system_test_lock_force_release'), t('Lock cannot be extended by this request.'), t('Lock'));
+
     // Check the shut-down function.
     $lock_acquired_exit = 'TRUE: Lock successfully acquired in system_test_lock_exit()';
     $lock_not_acquired_exit = 'FALSE: Lock not acquired in system_test_lock_exit()';
diff --git a/core/modules/system/tests/modules/system_test/system_test.module b/core/modules/system/tests/modules/system_test/system_test.module
index e833ba7..b165a2c 100644
--- a/core/modules/system/tests/modules/system_test/system_test.module
+++ b/core/modules/system/tests/modules/system_test/system_test.module
@@ -71,6 +71,13 @@ function system_test_menu() {
     'type' => MENU_CALLBACK,
   );
 
+  $items['system-test/lock-force-release'] = array(
+    'title' => 'Lock acquire',
+    'page callback' => 'system_test_lock_force_release',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
   $items['system-test/lock-exit'] = array(
     'title' => 'Lock acquire then exit',
     'page callback' => 'system_test_lock_exit',
@@ -291,6 +298,19 @@ function system_test_lock_acquire() {
 }
 
 /**
+ * Force-release a named lock and acquire it.
+ */
+function system_test_lock_force_release() {
+  lock()->forceRelease('system_test_lock_force_release');
+  if (lock()->acquire('system_test_lock_force_release')) {
+    return 'TRUE: Lock successfully acquired in system_test_lock_force_release()';
+  }
+  else {
+    return 'FALSE: Lock not acquired in system_test_lock_force_release()';
+  }
+}
+
+/**
  * Try to acquire a specific lock, and then exit.
  */
 function system_test_lock_exit() {
