import lombok.Getter;
import lombok.SneakyThrows;
@Getter // Lombok annotation to generate getter methods for the fields
class Database {
private static Database database;
private final String connection
;
private Database
(String connection
) { this.connection = connection;
}
@SneakyThrows // Lombok annotation to handle checked exceptions
public static synchronized Database getInstance
(String connection
) { System.
out.
printf("Thread %s entered a critical section\n",
Thread.
currentThread().
getName());
if (database == null) {
System.
out.
printf("Thread %s initializing the database instance\n",
Thread.
currentThread().
getName());
Thread.
sleep(1000); // Simulate resource-intensive initialization database = new Database(connection);
}
System.
out.
printf("Thread %s returns...\n",
Thread.
currentThread().
getName());
return database;
}
}
public class Main {
// Create two threads that attempt to access the singleton instance
Database.
getInstance("Dummy connection string of " + Thread.
currentThread().
getName()); }).start();
Database.
getInstance("Dummy connection string of " + Thread.
currentThread().
getName()); }).start();
// Allow some time for threads to complete their execution
// Retrieve the connection from the singleton instance and log the result
String finalConnection
= Database.
getInstance(null).
getConnection(); System.
out.
printf("Database connection: %s\n", finalConnection
); }
}
/*
Output without synchronized:
Thread Thread-1 entered a critical section
Thread Thread-1 initializing the database instance
Thread Thread-0 entered a critical section
Thread Thread-0 initializing the database instance
Thread main entered a critical section
Database connection: dummy_connection of Thread-1
Output with synchronized:
Thread Thread-1 entered a critical section
Thread Thread-1 initializing the database instance
Thread Thread-0 entered a critical section
Thread main entered a critical section
Database connection: Dummy connection string of Thread-1
*/
aW1wb3J0IGxvbWJvay5HZXR0ZXI7CmltcG9ydCBsb21ib2suU25lYWt5VGhyb3dzOwoKQEdldHRlciAvLyBMb21ib2sgYW5ub3RhdGlvbiB0byBnZW5lcmF0ZSBnZXR0ZXIgbWV0aG9kcyBmb3IgdGhlIGZpZWxkcwpjbGFzcyBEYXRhYmFzZSB7CiAgICBwcml2YXRlIHN0YXRpYyBEYXRhYmFzZSBkYXRhYmFzZTsKICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNvbm5lY3Rpb247CgogICAgcHJpdmF0ZSBEYXRhYmFzZShTdHJpbmcgY29ubmVjdGlvbikgewogICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CiAgICB9CgogICAgQFNuZWFreVRocm93cyAvLyBMb21ib2sgYW5ub3RhdGlvbiB0byBoYW5kbGUgY2hlY2tlZCBleGNlcHRpb25zCiAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBEYXRhYmFzZSBnZXRJbnN0YW5jZShTdHJpbmcgY29ubmVjdGlvbikgewogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJUaHJlYWQgJXMgZW50ZXJlZCBhIGNyaXRpY2FsIHNlY3Rpb25cbiIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKCiAgICAgICAgaWYgKGRhdGFiYXNlID09IG51bGwpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIlRocmVhZCAlcyBpbml0aWFsaXppbmcgdGhlIGRhdGFiYXNlIGluc3RhbmNlXG4iLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CgogICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7IC8vIFNpbXVsYXRlIHJlc291cmNlLWludGVuc2l2ZSBpbml0aWFsaXphdGlvbgogICAgICAgICAgICBkYXRhYmFzZSA9IG5ldyBEYXRhYmFzZShjb25uZWN0aW9uKTsKICAgICAgICB9CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJUaHJlYWQgJXMgcmV0dXJucy4uLlxuIiwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOwoKICAgICAgICByZXR1cm4gZGF0YWJhc2U7CiAgICB9Cn0KCnB1YmxpYyBjbGFzcyBNYWluIHsKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgLy8gQ3JlYXRlIHR3byB0aHJlYWRzIHRoYXQgYXR0ZW1wdCB0byBhY2Nlc3MgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZQoKICAgICAgICBuZXcgVGhyZWFkKCgpIC0+IHsKICAgICAgICAgICAgRGF0YWJhc2UuZ2V0SW5zdGFuY2UoIkR1bW15IGNvbm5lY3Rpb24gc3RyaW5nIG9mICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CiAgICAgICAgfSkuc3RhcnQoKTsKCiAgICAgICAgbmV3IFRocmVhZCgoKSAtPiB7CiAgICAgICAgICAgIERhdGFiYXNlLmdldEluc3RhbmNlKCJEdW1teSBjb25uZWN0aW9uIHN0cmluZyBvZiAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOwogICAgICAgIH0pLnN0YXJ0KCk7CgogICAgICAgIC8vIEFsbG93IHNvbWUgdGltZSBmb3IgdGhyZWFkcyB0byBjb21wbGV0ZSB0aGVpciBleGVjdXRpb24KICAgICAgICBUaHJlYWQuc2xlZXAoMjAwMCk7CgogICAgICAgIC8vIFJldHJpZXZlIHRoZSBjb25uZWN0aW9uIGZyb20gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBhbmQgbG9nIHRoZSByZXN1bHQKICAgICAgICBTdHJpbmcgZmluYWxDb25uZWN0aW9uID0gRGF0YWJhc2UuZ2V0SW5zdGFuY2UobnVsbCkuZ2V0Q29ubmVjdGlvbigpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJEYXRhYmFzZSBjb25uZWN0aW9uOiAlc1xuIiwgZmluYWxDb25uZWN0aW9uKTsKICAgIH0KfQoKLyoKCk91dHB1dCB3aXRob3V0IHN5bmNocm9uaXplZDoKIApUaHJlYWQgVGhyZWFkLTEgZW50ZXJlZCBhIGNyaXRpY2FsIHNlY3Rpb24KVGhyZWFkIFRocmVhZC0xIGluaXRpYWxpemluZyB0aGUgZGF0YWJhc2UgaW5zdGFuY2UKVGhyZWFkIFRocmVhZC0wIGVudGVyZWQgYSBjcml0aWNhbCBzZWN0aW9uClRocmVhZCBUaHJlYWQtMCBpbml0aWFsaXppbmcgdGhlIGRhdGFiYXNlIGluc3RhbmNlClRocmVhZCBtYWluIGVudGVyZWQgYSBjcml0aWNhbCBzZWN0aW9uCkRhdGFiYXNlIGNvbm5lY3Rpb246IGR1bW15X2Nvbm5lY3Rpb24gb2YgVGhyZWFkLTEKCk91dHB1dCB3aXRoIHN5bmNocm9uaXplZDoKVGhyZWFkIFRocmVhZC0xIGVudGVyZWQgYSBjcml0aWNhbCBzZWN0aW9uClRocmVhZCBUaHJlYWQtMSBpbml0aWFsaXppbmcgdGhlIGRhdGFiYXNlIGluc3RhbmNlClRocmVhZCBUaHJlYWQtMCBlbnRlcmVkIGEgY3JpdGljYWwgc2VjdGlvbgpUaHJlYWQgbWFpbiBlbnRlcmVkIGEgY3JpdGljYWwgc2VjdGlvbgpEYXRhYmFzZSBjb25uZWN0aW9uOiBEdW1teSBjb25uZWN0aW9uIHN0cmluZyBvZiBUaHJlYWQtMQoqLw==
Main.java:1: error: package lombok does not exist
import lombok.Getter;
^
Main.java:2: error: package lombok does not exist
import lombok.SneakyThrows;
^
Main.java:4: error: cannot find symbol
@Getter // Lombok annotation to generate getter methods for the fields
^
symbol: class Getter
Main.java:13: error: cannot find symbol
@SneakyThrows // Lombok annotation to handle checked exceptions
^
symbol: class SneakyThrows
location: class Database
Main.java:46: error: cannot find symbol
String finalConnection = Database.getInstance(null).getConnection();
^
symbol: method getConnection()
location: class Database
5 errors