问题:首先是关于 synchronized 关键字,如下面这段代码。
public void run() {
while(!canceled) {
synchronized(this) {
++number;
}
print(this + " Total: " + count.increment());
try {
TimeUnit.MILLISECONDS.sleep(100);
} catch(InterruptedException e) {
print("sleep interrupted");
}
}
在main()里:同时执行3个线程,但是上面的run()方法已经被锁定,那么其他线程就不能访问了?
for(int i = 0; i < 3; i++)
exec.execute(new Entrance(i));
TimeUnit.SECONDS.sleep(1);
Entrance.cancel();
exec.shutdown();我一直不搞不明白,既然说 synchronized 能够将方法锁住,防止其他线程进行访问,可是当执行多个线程的时候,同一方法还是被同时访问了,所以对这个概念很模糊,希望大家能帮忙指点下。~~
public void run() {
while(!canceled) {
synchronized(this) {
++number;
}
print(this + " Total: " + count.increment());
try {
TimeUnit.MILLISECONDS.sleep(100);
} catch(InterruptedException e) {
print("sleep interrupted");
}
}
在main()里:同时执行3个线程,但是上面的run()方法已经被锁定,那么其他线程就不能访问了?
for(int i = 0; i < 3; i++)
exec.execute(new Entrance(i));
TimeUnit.SECONDS.sleep(1);
Entrance.cancel();
exec.shutdown();我一直不搞不明白,既然说 synchronized 能够将方法锁住,防止其他线程进行访问,可是当执行多个线程的时候,同一方法还是被同时访问了,所以对这个概念很模糊,希望大家能帮忙指点下。~~
synchronized(this) {
++number;
}
里面的操作不能被打断.而且你这里的this是当前对象,如果是3个线程的话是3个不同的对象,不是在一个地方加的锁,相互没什么影响.
你使用了this,这种写法最容易导致初学者出错
多个线程使用一个对象
ThreadTest t= new ThreadTest();
new Thread(t).start();
new Thread(t).start();
这个时候你锁this是可以的
多个线程使用不同对象
new ThreadTest().start();
new ThreadTest().start();
new ThreadTest().start();
这个时候你锁this是没用的结合楼上各位所述,你再理解下