Tym razem nietypowo.
W pewnej firmie tworzono aplikację wielowątkową. W wielu klasach stosowano następujący wzorzec:
- blokady są numerowane, żeby zapobiec deadlockom (zawsze synchronizowanie kolejno na LOCK1, LOCK2,...)

public class Main {

private static final Logger LOG = LoggerFactory.getLogger(Main.class.getName());
private static final String LOCK1 = "LOCK1";
private static final String LOCK2 = "LOCK2";

public void foo() {
synchronized (LOCK1) {
LOG.trace("Synchronized by: {}", LOCK1);
//...kod
synchronized (LOCK2) {
LOG.trace("Synchronized by: {}", LOCK2);

Czy z takim rozwiązaniem jest wszystko ok (biorę po plusie i zapraszam do głosowania i dyskusji)

  • Tak, nie widzę problemu. 12.5% (2)
  • Uuuu Panie, kto to panu tak spierdolił? 87.5% (14)

Oddanych głosów: 16

@afe1: Poprzednie zagadki to były kilkulinijkowe kody, które sobie można samemu sprawdzić online minimalnym wysiłkiem. W tym wypadku raczej też nie jest potrzebne IDE do sprawdzenia co by było gdyby...
Jak ktoś chce się czegoś nauczyć to niech chociaż odpali kod i ewentualnie zada konkretne pytanie, a nie "dej mi odpowiedzi i wszystkie kombinacje bo inaczej ankieta do dupy".
public static void main(String[] args) {
try {
throw new IOException();
} catch (Error | Exception ex) {
handle(ex);
}
}

public static void handle(Exception ex) {
System.out.println("exception");
}

public static void handle(IOException ex) {
System.out.println("ioexception");
}

public static void handle(Throwable t) {
System.out.println("throwable");
}

#java #javapuzzle

Co wypisze

  • Błąd kompilacji 19.4% (7)
  • exception 27.8% (10)
  • ioexception 27.8% (10)
  • throwable 25.0% (9)

Oddanych głosów: 36

@Mike-Wazowski: W multi-catch czyli tam gdzie podajemy w klauzuli catch więcej niż jeden typ wyjątku oddzielony znakiem | zmienna wyjątku jest typu, który jest najbliższą w hierarchii klasą bazową wspólną dla wszystkich wskazanych tam typów. Dla przykładu z ankiety dla Error i Exception najbliższą klasą bazową jest Throwable czyli ex jest referencją typu Throwable.
Dalej mamy przeładowaną metodę handle i w grę wchodzi dopasowanie przeładowanej wersji metody do wywołania.
public class NewClass {
public static void main(String[] args) {
Integer[] tab = {1,2,3,4,5};
List list = Arrays.asList(null, null, null);
Integer[] tab2 = list.toArray(tab);
System.out.println(Arrays.toString(tab));
}
}
#java #naukaprogramowania #javapuzzle

Co wypisze

  • [1, 2, 3, 4, 5] 47.6% (20)
  • [null, null, null, 4, 5] 26.2% (11)
  • [null, null, null] 4.8% (2)
  • [null, null, null, null, 5] 21.4% (9)

Oddanych głosów: 42

public class NewClass {
public static void main(String[] args) {
try {
int i = getTab()[getIndex()];
} catch (Exception e) {
System.out.print("1");
}
}

public static int[] getTab() {
System.out.print("3");
return null;
}

private static int getIndex() {
System.out.print("2");
return -1;
}
}

#java #naukaprogramowania #javapuzzle

Co wypisze

  • 21 13.0% (6)
  • 31 13.0% (6)
  • 321 43.5% (20)
  • Błąd kompilacji 30.4% (14)

Oddanych głosów: 46