Java 锁外螺纹还是锁内螺纹?
我正在学习线程安全,在网上搜索时似乎找不到问题的明确答案 这两者之间的区别和影响是什么:Java 锁外螺纹还是锁内螺纹?,java,multithreading,thread-safety,locking,Java,Multithreading,Thread Safety,Locking,我正在学习线程安全,在网上搜索时似乎找不到问题的明确答案 这两者之间的区别和影响是什么: synchronized (lock) { new Thread () { public void run() { // critical section } }.start(); } 这是: new Thread () { public void run() { synchronized (lock) {
synchronized (lock) {
new Thread () {
public void run() {
// critical section
}
}.start();
}
这是:
new Thread () {
public void run() {
synchronized (lock) {
// critical section
}
}
}.start();
为了给您一个上下文,我正在编写一个小型实验室,方法是“每个请求一个线程”,因此每次调用该方法时,上面的任何一个都会执行到“关键部分”,并在它自己的线程中执行
那么,在线程内部或外部设置锁会产生影响吗?每个线程是“继承”锁还是必须在每个线程内才能完全实现线程安全 同步仅仅意味着一次只有一个线程可以执行代码的某些部分 在第一个示例中,一次只有一个线程可以创建和启动新线程。但是请注意,您没有保护关键部分,因为多个线程可以同时执行其run方法
synchronized (lock) {
new Thread () {
public void run() {
// critical section
}
}.start();
}
在第二个示例中,多个线程可以创建并启动一个新线程,但一次只有一个线程可以执行受锁保护的关键部分
new Thread () {
public void run() {
synchronized (lock) {
// critical section
}
}
}.start();
第一个是无用的。第一个在thread.start之后释放锁,第二个是正确的,在释放锁之前等待run方法中的所有代码完成!谢谢:为什么要在自己的线程中运行一个关键部分?关键部分的要点是,同一时间只能有一个线程,那么为什么不在您所在的线程中运行该部分,而不是运行一个新线程呢?新线程没有任何好处,许多缺点需要更长的时间,更多的内存使用,更多的垃圾被收集。编辑的意图是这样的。如果我给你完整的背景,你会明白的。这只是一个摘录;对于详细的解释,您可以得到以下答案: