@ is the AddressOf operator.
In Delphi mode, addresses of methods are taken automagically, and the syntax does not require "@" when referencing a method as a parameter when you call its code. In obfpc mode the syntax is stricter, and where you are calling the code of a method, it is required to use the @ operator on the method's name (which returns the method's address).
Because the code I provided is a GUI app rather than a console app it requires an extra level of synchronisation because it becomes a multi-threaded program. Its main thread, governed by the Application instance, processes OS messages and manages the GUI. The other threads that are spawned as philosophers know nothing about the main thread. The main thread of a GUI program needs to be synchronised with any other threads that are running which wish to interact with the main thread. In this case those threads need to post new lines in the memo and get the OS to update the memo widget. The call to Synchronize ensures that those threads do not collide with the non re-entrant main GUI thread.
Console apps can generally spew WriteLns to the console with impunity, and will not be interfering with a main GUI thread (since there is none).
At least, that is my understanding. I do little thread programming, so others may have more helpful things to say about this than me.