If you are implementing the accessors for an atomic declared property, you are responsible for ensuring the atomicity promised by the declaration. Atomicity may not be what you think. A lot of people have misconceptions about it. But, anyway, you can use @synchronized to implement it, but that's not the only way.
For scalar types of the size of a "word" in the CPU architecture (32- or 64-bit value), simple assignment and returning of the value is already atomic. For object pointers when building with ARC, simple assignment and returning of the value is also atomic. For object pointers when not building with ARC, you need some other synchronization mechanism and getters should retain within the synchronized code and autorelease before returning.
For larger scalar types (e.g. NSRect), you also have to use a synchronization mechanism. If your accessors do additional work, you also have to use a synchronization mechanism.
Personally, I make all of my properties nonatomic because atomic properties buy you almost nothing. For a class to be thread-safe requires much more and, once you do that, the atomicity of the properties becomes irrelevant.