关于lock(object){code}代码内赋值的困惑

关于lock(object){code}代码内赋值的疑惑!
比如有
int a; Object ob ;
构造:ob = new Object();
线程方法:
void test()
{
while(!stop)
{ lock(ob)
{a++;}
}
}
然后运行线程1,2,为什么 a的值能正确反映1,2线程运算的总和呢?而不是只是线程1的值或者线程2的值?(当然这里就算不用lock也不会是单独线程的值) 不是该写成volatile int a吗?
是循环里面的语句每次循环都要重新编译吗,然后每次都直接从内存取值?



------解决方案--------------------
class A
{
int a=0;
void test()
{
while(!stop)
{ lock(ob)
{a++;}
}
}
}
a只是在类A中定义的变量,至于说类A是主线程,那可不一定

比如我这样定义
void Main()
{
Thread t=new Thread(f);
t.Start();
}
void f()
{
A a1=new A();
a1.test();
}
此处我就是在线程里实例化了类A,那么这个实例整个都是运行在线程中的.