-1

Pourquoi un thread n'attend-il pas un verrouillage d'objet en réponse à une interruption? J'ai fait quelques recherches et j'ai lu interuppting blocked thread. Je comprends les arguments comme dans java, seules les méthodes peuvent être forcées à lancer des exceptions et les blocs synchronisés ne peuvent pas être forcés à lancer une exception, etc. Mais ce type de comportement d'attente de verrouillage semble être une cause évidente d'interblocages, donc pourquoi la spécification de la langue ne peut-elle pas faire en sorte que les blocs synchronisés lancent une exception interrompue et obligent le développeur à la gérer? Y a-t-il de bonnes raisons pour que la spécification du langage ne le fasse pas? En outre, la réponse indique que les interruptions n'arrêtent/n'annulent pas les threads. Si c'est le cas, pourquoi Lock.lockInterruptibly() est-il introduit plus tard?Pourquoi un thread n'attend-il pas un verrouillage d'objet en réponse à une interruption?

+0

Pourriez-vous poster le code pertinent? – Ali

Répondre

2

Le point entier du mot-clé synchronized doit être simple (ou du moins aussi simple que peut l'être le multithreading). Ceci est explicitement indiqué à Oracle de Java tutorial on Lock objects:

Code Synchronisé repose sur un simple type de serrure rentrante. Ce type de verrou est facile à utiliser, mais comporte de nombreuses limitations. Les idiomes de verrouillage plus sophistiqués sont supportés par le paquet java.util.concurrent.locks.

L'une de ces limitations est l'impossibilité d'interrompre un thread en attente. Fondamentalement, le principe de conception est que si vous avez juste besoin de la forme la plus simple d'exclusion mutuelle, synchronized est bien; Si vous avez besoin de quelque chose de plus que le minimum, vous devez utiliser l'un des autres outils plus sophistiqués.

+1

... et à cause de tout cela, vous devriez concevoir votre code de manière à ce qu'aucun thread ne contienne un verrou 'synchronized' pour une durée supérieure à celle nécessaire pour mettre à jour quelques champs. –

+0

Je suis d'accord avec la réponse. Je ne suis pas confus au sujet du comportement. Ce que je n'ai pas compris, c'est que ce comportement «pour toujours essayer de verrouiller» semblait mener à des blocages faciles et à aucune récupération. Je ne peux pas attendre un délai d'attente et d'interruption. Si c'est une source évidente pour les interblocages alors les concepteurs de la langue auraient pensé à un moyen de sortir. Une solution que je pouvais penser était d'interrompre (en supposant que l'interruption est la meilleure façon d'arrêter un thread). Je voulais comprendre s'il y avait une forte raison pour laquelle aucune solution n'a été donnée pour ce problème par la conception de la langue plus tôt. Ou peut être mes hypothèses sont fausses. – Thiru

+0

Eh bien, il est tout à fait possible que vous accédiez à plusieurs verrous à la fois, tout d'abord. Et les concepteurs de langage ont pensé à une solution: les constructions plus sophistiquées mentionnées plus haut. Dans beaucoup de cas, tout ce que vous voulez est un moyen simple de définir des champs atomiquement, ou quelque chose d'aussi simple, et dans ces cas, il est agréable d'avoir une construction facile qui fait exactement ce dont vous avez besoin. – yshavit